eptm_dashboard/data/docs/05-cron.md

78 lines
3 KiB
Markdown

# 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.