88 lines
3.8 KiB
Markdown
88 lines
3.8 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, 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.
|