4.1 KiB
Push vers Escada
Le push envoie les modifications locales (absences en EscadaPending + notices en attente dans Notice) vers Escadaweb via Playwright.
Page : /escada → « Pousser vers Escada »
Quand un pending d'absence est créé ?
Chaque modification d'absence dans l'application crée ou met à jour une entrée dans EscadaPending :
| Action utilisateur | Pending créé |
|---|---|
| Marquer P3 comme excusée | action=E |
| Marquer P5 comme non excusée | action=N |
| Retirer une absence (présent) | action=clear |
| Excuse rapide d'une journée (page Apprentis) | action=E × n |
| « Absent toute la journée » (selon horaire classe) | action=N × n (sur enregistrement) |
La contrainte d'unicité (apprenti_id, date, periode) garantit qu'une période a au plus un pending. Si on modifie deux fois la même période, le dernier pending écrase le précédent.
Phases du push d'absences
Phase 1 : Préparation
scripts/push_to_escada.py :
- Lit toutes les entrées de
EscadaPending - Groupe par classe pour minimiser les navigations Escada
- Lance Playwright
Phase 2 : Exécution Playwright
Pour chaque pending :
- Navigue jusqu'à la page d'absences de l'apprenti dans Escadaweb
- Trouve la cellule (date × période)
- Selon l'action :
E: sélectionne « Excusée » dans le dropdownN: sélectionne « Non excusée »clear: remet à blanc (= apprenti présent)
- Clique sur Speichern (Enregistrer)
- Si OK → supprime l'entrée du
EscadaPending - Si erreur → conserve l'entrée et la liste dans
PUSH_DONE
Phase 3 : Rapport
Le script imprime une ligne PUSH_DONE {"ok": N, "err": [...]} à la fin. L'app la parse et affiche :
- Nombre d'envois OK
- Liste des erreurs (chaque erreur mentionne l'apprenti, la date et la période)
Push de notices
Les notices créées localement (création d'avis de retenue ou de sanction depuis l'app) sont enregistrées dans la table Notice (statut pending), puis poussées par scripts/push_notices.py.
Workflow
- L'utilisateur clique sur « Générer l'avis » dans une modale d'avis sanction/retenue. Cela :
- Génère le PDF (téléchargement)
- Crée une
Noticeavecsource="sanction"ou"retenue",status="pending", et le préfixe(<username>)est ajouté en début de la remarque pour traçabilité
- La file
Notice (status=pending)est visible côté admin sur/escadaou via les tâches cron. push_notices.py:- Lit les notices
pending - Pour chaque, navigue dans Escada (page de l'apprenti → onglet Notices) et crée la notice avec son titre + remarque + date
- Marque comme
syncedsi OK,error(+error_msg) sinon
- Lit les notices
task_kind cron
task_kind=push+sync_abs=1→ pousse les absencestask_kind=push+sync_notices=1→ pousse les noticestask_kind=push+ les deux → push absences puis notices (séquentiel)
Que faire si un push échoue ?
- Vérifier les logs (
/logs) — l'erreur exacte est tracée. - Causes fréquentes :
- Session Escada expirée → relancer un Actualiser sur la page Escada (re-login automatique)
- Apprenti avec un nom différent dans Escada → renommage à faire dans la DB ou côté Escada
- Page de notation verrouillée par un collègue (Escada utilise des locks pessimistes)
- Re-tenter : les pendings (et notices
pending/error) restent en file d'attente, un nouveau push les retraitera.
Audit
Chaque push manuel logue qui l'a déclenché :
[abs] {user} : Push Escada démarré par {username}
[notice] {user} : création (sanction) pour {apprenti}
[notice] {user} : création (retenue) pour {apprenti} — case=devoir
Côté résultat :
Push terminé — ok:N erreurs:Mdansoperations.log
Push automatique via cron
Les tâches planifiées de type push ou push_then_sync exécutent les mêmes scripts. Voir la section Tâches planifiées.