132 lines
5.6 KiB
Markdown
132 lines
5.6 KiB
Markdown
# É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`
|