eptm_dashboard/data/docs/05-cron.md
2026-05-12 15:30:28 +02:00

88 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 (00h23h) 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.