66 lines
2.6 KiB
Markdown
66 lines
2.6 KiB
Markdown
# 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](#).
|