eptm_dashboard/docs/04-edition-absences.md

132 lines
5.6 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.

# Édition des absences
## Page : « Apprentis » (`/fiche`)
### Sélectionner un apprenti
Le sélecteur en haut de la page propose une recherche en direct : tape une partie du nom, prénom ou classe pour filtrer.
**Raccourcis** :
- `/` ouvre directement le sélecteur
- `Entrée` sélectionne le premier résultat filtré
- `Échap` ferme la recherche
### KPIs et bandeau d'actions
Sous le sélecteur, 3 cartes KPI :
- **Périodes d'absence** : total
- **Périodes à excuser** : non encore traitées
- **Absences** : nombre de blocs ; rouge avec libellé « Avis de sanction » dès le quota EM atteint
Sous les KPIs, un bandeau d'actions :
- **PDF absences / PDF bulletin / PDF notes** (téléchargement)
- **Créer un avis de retenue** (orange) → ouvre la modale retenue pré-remplie
- **Créer un avis de sanction** (rouge) → ouvre la modale sanction pré-remplie
Ces boutons sont identiques sur la page « Classes », par carte apprenti.
### Calendrier mensuel
Chaque cellule représente un jour du mois. Les couleurs indiquent l'état :
| Couleur de fond | Signification |
|-----------------|------------------------------------------|
| Blanc | Aucune absence |
| Vert clair | Toutes les absences sont excusées |
| Rose | Au moins une absence non excusée |
| Bleu | Jour sélectionné en édition |
| Bleu pâle | Aujourd'hui |
Les nombres dans les cellules :
- « 2 ⚠️ 1 » → 2 absences au total dont 1 non excusée
- « 5 » → 5 absences toutes excusées
Cliquer sur un jour avec absences (ou un autre jour) ouvre le panneau d'édition.
### Panneau d'édition
#### Badge type de jour
À côté du titre « Édition du {date} » s'affiche un badge coloré indiquant le type de jour pour cette classe (selon le mapping défini en /params) :
- 🔵 **Théorie** (bleu)
- 🟠 **Pratique** (orange)
- 🟣 **Matu** (violet)
- (rien) si aucun type configuré
#### Périodes
10 lignes (P1 à P10) avec un **segmented control** à 3 boutons :
- **Présent** (gris) — l'apprenti était là
- **E** (orange) — Excusée
- **N** (rouge) — Non excusée
Un seul clic suffit. Le bouton **Enregistrer** sauve toutes les modifications de la journée d'un coup. Le panneau reste ouvert après l'enregistrement pour permettre un éventuel ajustement.
#### Actions rapides
- **Absent toute la journée** (rouge) — met à `N` uniquement les périodes définies dans l'horaire de la classe pour le jour de la semaine sélectionné (cf. ci-dessous).
- Bouton **grisé** + libellé « Absent toute la journée (Données chronoplan manquantes) » si l'horaire n'est pas configuré pour ce (classe × jour).
- **Excuser toutes les périodes** (vert) — bascule visuellement toutes les `N` en `E`. N'enregistre pas en DB tant qu'on ne clique pas sur **Enregistrer**.
### Excuse rapide (« Valider toutes les absences d'une journée »)
Sous le calendrier, un bandeau jaune liste les jours qui ont au moins une absence non encore traitée (statut `a_traiter`). Cliquer sur un de ces boutons excuse **toutes les absences à traiter de ce jour-là** en une seule action.
### Envoyer par email
Un bloc « Envoyer par email » permet d'envoyer le récap (et éventuellement le bulletin / les notes en pièces jointes) à l'apprenti, au formateur ou à une adresse libre. Objet et corps utilisent le template configurable en `/params → Template email` (variables `{prenom}`, `{nom_complet}`, `{classe}`, etc.).
## Horaire de classe (« chronoplan »)
Configuré en **Paramètres → Horaires de classe** :
- Sélection d'une classe (dropdown alimenté par les classes en base)
- Pour chaque jour (Lun → Ven) :
- Sélecteur de **type de jour** : Théorie / Pratique / Matu / —
- Grille de **10 cases** (P1 → P10), cliquables (rouge = active)
- Bouton « Enregistrer l'horaire »
Stocké dans `data/settings.json` sous la clé `class_schedule` :
```json
"AUTOMAT 1": {
"MON": { "type": "theorie", "periods": [1, 2, 3, 4] },
"TUE": { "type": "pratique", "periods": [5, 6, 7, 8] },
"WED": { "type": "matu", "periods": [1, 2] }
}
```
Le bouton « Absent toute la journée » dans la fiche apprenti lit cette config en fonction de `apprenti.classe` + jour de la semaine de la date sélectionnée.
## Page : « Classes » (`/classe`)
### Sélection de classe
Même principe que pour les apprentis : recherche en direct avec `/`, `Entrée`, `Échap`.
### Cartes apprenti
Chaque apprenti de la classe a une carte avec :
- Nom + lien vers sa fiche complète
- Badge « Sanction » si quota atteint (≥5 absences brutes en blocs, classes EM uniquement)
- KPIs identiques à la fiche apprenti (3 cartes : Périodes d'absence, Périodes à excuser, Absences)
- Bandeau d'actions identique : PDF absences/bulletin/notes + Créer avis de retenue + Créer avis de sanction
- Onglets BN / Notes d'examen / Notices pour visualiser
## Audit des modifications
Chaque modification d'absence est tracée dans `data/logs/operations.log` :
```
[14:32:01] [abs] prof.demo : Dupont Marc (1MAB1) — 04.02.2026 P6 : N → E
[14:32:01] [abs] prof.demo : Dupont Marc (1MAB1) — 04.02.2026 P6 : N → E
```
Visible aussi sur la page `/logs`. Le champ `updated_by` de la table `Absence` enregistre le dernier utilisateur ayant modifié.
## Effet de chaque modification
1. La table `Absence` est mise à jour (ou créée/supprimée)
2. Une entrée `EscadaPending` est ajoutée pour le push ultérieur vers Escada
3. Un toast de confirmation s'affiche
4. Une ligne est ajoutée à `operations.log`