# Push vers Escada Le push envoie les modifications locales (table `EscadaPending`) vers Escadaweb via Selenium. ## Page : `/escada` → "Pousser vers Escada" ### Quand un pending 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 Fiche) | `action=E` × n | 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 ### Phase 1 : Préparation `scripts/push_to_escada.py` : 1. Lit toutes les entrées de `EscadaPending` 2. Groupe par classe pour minimiser les navigations Escada 3. Lance Selenium ### Phase 2 : Exécution Selenium Pour chaque pending : 1. Navigue jusqu'à la page d'absences de l'apprenti dans Escadaweb 2. Trouve la cellule (date × période) 3. Selon l'action : - `E` : sélectionne "Excusée" dans le dropdown - `N` : sélectionne "Non excusée" - `clear` : remet à blanc (= apprenti présent) 4. Clique sur **Speichern** (Enregistrer) 5. Si OK → supprime l'entrée du `EscadaPending` 6. Si erreur → conserve l'entrée et la liste les erreurs 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) ## Que faire si un push échoue ? 1. **Vérifier les logs** (`/logs`) — l'erreur exacte est tracée. 2. **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) 3. **Re-tenter** : les pendings 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}`. Côté résultat : - `Push terminé — ok:N erreurs:M` dans `operations.log` ## Push automatique via cron La tâche planifiée de type `push` ou `push_then_sync` exécute le même script. Voir la section [Tâches planifiées](#).