# É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`