feat(loans): confirm declared material state changes

This commit is contained in:
SaidSoighiri94
2026-07-24 13:41:40 +02:00
parent 3739e9b0a0
commit a562b3248f
26 changed files with 1832 additions and 282 deletions
+50
View File
@@ -0,0 +1,50 @@
# Parcours utilisateur validé
Ce diagramme remplace le PNG historique `parcour_utilisateur.png`, qui décrit
partiellement l'ancien workflow automatique.
```mermaid
flowchart TD
A[Identification étudiant] --> B{Action}
B -->|Emprunter| C[Sélection du matériel]
C --> D{Même catégorie déjà bloquée ?}
D -->|Oui| E[Demande refusée]
D -->|Non| F[Checklist de départ<br/>préremplie avec l'état de référence]
F --> G{État modifié ?}
G -->|Non| H[Matériel EMPRUNTE<br/>Emprunt EN_COURS]
G -->|Oui| I[Matériel RESERVE<br/>Emprunt EN_ATTENTE_VALIDATION_DEPART]
I --> J[Alerte responsable du campus]
J --> K{Confirmation de l'écart}
K -->|Confirmé| L[Anomalie créée<br/>État de départ authentifié]
K -->|Refusé| M[Modification non appliquée]
L --> H
M --> H
B -->|Restituer| N[Sélection d'un emprunt personnel]
N --> O[Checklist de retour préremplie<br/>avec l'état de départ validé]
O --> P{État modifié ?}
P -->|Non| Q[Emprunt CLOTURE<br/>Matériel DISPONIBLE]
P -->|Oui| R[Emprunt EN_ATTENTE_VALIDATION_RETOUR<br/>Alerte responsable]
R --> S{Confirmation du changement}
S -->|Confirmé| T[Anomalie créée<br/>RETOUR_NON_CONFORME et état final]
S -->|Refusé| Q
Q --> U[Catégorie débloquée]
T --> U
```
## Règles structurantes
- Le départ et le retour sont automatiques lorsque la checklist préremplie
reste inchangée.
- Au retour, l'état validé au départ est automatiquement repris.
- Dès que l'étudiant modifie une valeur, le responsable est alerté et doit
confirmer ou refuser le changement.
- Une anomalie et un changement d'état officiel ne sont appliqués qu'après
confirmation du responsable.
- Une catégorie reste bloquée pour l'étudiant tant que le retour précédent
n'a pas été clôturé.
- Il n'existe pas de limite d'une fois par jour après clôture du retour.
- Chaque tentative de modification, décision, anomalie et changement de
statut matériel est tracé.
+11 -4
View File
@@ -96,9 +96,13 @@ classDiagram
+ModeIdentification modeIdentificationRetour
+String commentaireDepart
+String commentaireRetour
+creer()
+enregistrerRetour()
+cloturer()
+confirmerDepartInchange()
+soumettreEcartDepart()
+confirmerEcartDepart()
+initialiserRetourDepuisDepart()
+confirmerRetourInchange()
+soumettreEcartRetour()
+confirmerEcartRetour()
+marquerEnRetard()
}
@@ -152,6 +156,7 @@ classDiagram
class StatutMateriel {
<<enumeration>>
DISPONIBLE
RESERVE
EMPRUNTE
NON_CONFORME
DETERIORE
@@ -161,8 +166,10 @@ classDiagram
class StatutEmprunt {
<<enumeration>>
EN_ATTENTE_VALIDATION_DEPART
EN_COURS
EN_RETARD
EN_ATTENTE_VALIDATION_RETOUR
CLOTURE
RETOUR_NON_CONFORME
ANNULE
@@ -237,4 +244,4 @@ classDiagram
Anomalie "0..1" --> "0..*" Notification : genere
```
```
+31 -24
View File
@@ -1,5 +1,5 @@
# Règles métier — EME
## Nouveau workflow d'emprunt et de restitution autonome
## Workflow automatique avec confirmation responsable des écarts
Les règles métier définissent les contraintes fonctionnelles que l'application EME — Emprunt Matériel ENSUP doit respecter dans le cadre du nouveau workflow validé.
@@ -36,7 +36,7 @@ Chaque emprunt et restitution doit être associé au poste dédié, à la salle
Chaque matériel doit être identifié de manière unique par une référence, un numéro d'inventaire ou un numéro de série, et rattaché à une catégorie, un campus et un statut.
**RG07 — Disponibilité du matériel**
Seuls les matériels ayant le statut `DISPONIBLE` peuvent être empruntés. Un matériel emprunté, non conforme, détérioré, en maintenance ou indisponible ne peut pas faire l'objet d'un nouvel emprunt.
Seuls les matériels ayant le statut `DISPONIBLE` peuvent faire l'objet d'un emprunt. Sans écart déclaré au départ, le matériel passe directement à `EMPRUNTE`. Si l'étudiant modifie l'état prérempli d'un élément, le matériel passe à `RESERVE` jusqu'à la décision du responsable. Un matériel réservé, emprunté, non conforme, détérioré, en maintenance ou indisponible ne peut pas faire l'objet d'un autre emprunt.
**RG08 — Accessoires attendus**
Chaque matériel peut être associé à une liste d'accessoires attendus (chargeur, souris, câble, housse, etc.).
@@ -51,11 +51,17 @@ L'étudiant doit choisir l'action `Emprunter` depuis l'écran d'accueil, puis s'
**RG10 — Affichage des matériels disponibles**
Après identification, le système affiche uniquement les matériels disponibles du campus concerné.
**RG11Checklist de départ obligatoire**
Une checklist de départ doit être obligatoirement renseignée avant la création de l'emprunt. Elle reprend les accessoires attendus du matériel sélectionné. L'étudiant indique pour chaque élément son état : `PRESENT`, `ABSENT` ou `DETERIORE`.
**RG10AUnicité d'emprunt actif par catégorie**
Un étudiant ne peut pas demander un matériel d'une catégorie s'il possède déjà un emprunt bloquant de cette même catégorie. Sont bloquants les emprunts `EN_ATTENTE_VALIDATION_DEPART`, `EN_COURS`, `EN_RETARD` et `EN_ATTENTE_VALIDATION_RETOUR`. La catégorie redevient empruntable après la clôture automatique d'un retour sans écart ou après la décision du responsable sur un retour modifié. Il n'existe pas de limite calendaire : l'étudiant peut emprunter à nouveau la catégorie le même jour après cette clôture.
**RG12 — Création automatique de l'emprunt**
Après validation de la checklist de départ, le système crée automatiquement l'emprunt, enregistre la date et l'heure, et fait passer le matériel au statut `EMPRUNTE`.
**RG11 — Checklist de départ obligatoire**
Une checklist de départ doit être obligatoirement vérifiée avant la création de l'emprunt. Elle reprend les accessoires attendus du matériel sélectionné et initialise automatiquement chaque élément dans son état de référence, normalement `PRESENT`. L'étudiant contrôle physiquement le matériel et ne modifie une valeur en `ABSENT` ou `DETERIORE` que s'il constate réellement un écart.
**RG12 — Départ automatique sans écart**
Si l'étudiant confirme la checklist de départ préremplie sans la modifier, l'emprunt passe directement à `EN_COURS` et le matériel à `EMPRUNTE`. Aucune validation du responsable n'est requise pour ce départ normal.
**RG12A — Confirmation d'un écart au départ**
Dès que l'étudiant modifie l'état prérempli d'un élément, le système place le départ en `EN_ATTENTE_VALIDATION_DEPART`, réserve le matériel et alerte les responsables du campus. La modification reste provisoire et ne change pas l'état officiel du matériel. Le responsable contrôle l'écart et le confirme ou le refuse. Une confirmation authentifie le nouvel état de départ, crée l'anomalie correspondante, puis permet le passage à `EN_COURS` et `EMPRUNTE`. Un refus n'applique pas l'état déclaré par l'étudiant. La décision, son auteur, sa date et son observation éventuelle sont historisés.
**RG13 — Détection automatique des emprunts en retard**
Lorsqu'un emprunt dépasse sa date de retour prévue sans avoir été restitué, son statut passe automatiquement à `EN_RETARD` et il apparaît dans le tableau de bord du responsable matériel.
@@ -71,23 +77,26 @@ L'étudiant doit choisir l'action `Restituer` depuis l'écran d'accueil, puis s'
Après identification, le système affiche uniquement les emprunts en cours de l'étudiant identifié. Un étudiant ne peut restituer que ses propres emprunts.
**RG16 — Checklist de retour obligatoire**
Une checklist de retour doit obligatoirement être renseignée. Elle reprend les mêmes éléments que la checklist de départ pour permettre la comparaison.
Une checklist de retour doit être obligatoirement vérifiée. Elle est automatiquement préremplie avec l'état de départ validé de chaque élément. L'étudiant ne modifie une valeur que s'il constate une différence au moment de la restitution.
**RG17 — Comparaison automatique des checklists**
Le système compare automatiquement la checklist de départ avec la checklist de retour pour déterminer la conformité de la restitution.
Le système compare automatiquement la checklist de retour avec l'état de départ validé. Une checklist inchangée constitue un retour conforme. Toute modification constitue une déclaration d'écart provisoire soumise à la confirmation du responsable.
**RG18 — Retour conforme**
Si la checklist de retour correspond à celle de départ, l'emprunt est clôturé et le matériel repasse au statut `DISPONIBLE`.
**RG18 — Retour automatique sans écart**
Si l'étudiant confirme la checklist de retour préremplie sans la modifier, le retour est clôturé automatiquement : l'emprunt passe à `CLOTURE` et le matériel à `DISPONIBLE`. Aucune validation du responsable n'est requise.
**RG19 — Retour non conforme**
Si une différence est détectée, l'emprunt passe au statut `RETOUR_NON_CONFORME` et le matériel peut passer à `NON_CONFORME`, `DETERIORE`, `MAINTENANCE` ou `INDISPONIBLE` selon le problème détecté.
**RG19 — Confirmation d'un changement au retour**
Dès que l'étudiant tente de modifier une valeur préremplie, l'emprunt passe à `EN_ATTENTE_VALIDATION_RETOUR`, le matériel reste indisponible et une alerte est envoyée aux responsables du campus. Le changement reste provisoire : il ne modifie ni l'état officiel du matériel ni l'état de départ conservé. Après contrôle, le responsable confirme ou refuse la différence. Une confirmation crée l'anomalie et applique l'état final approprié avec le statut `RETOUR_NON_CONFORME`. Un refus conserve l'état validé au départ et permet une clôture conforme. La décision est historisée.
**RG19A — Déblocage de la catégorie**
La catégorie est débloquée immédiatement après un retour automatique sans écart. Lorsqu'une différence est déclarée, elle reste bloquée jusqu'à la décision du responsable, puis est débloquée que la différence soit confirmée ou refusée.
---
## 6. Anomalies
**RG20 — Création automatique d'une anomalie**
Une anomalie est créée automatiquement si un élément présent au départ est absent au retour, ou si un élément est déclaré détérioré au retour.
**RG20 — Création d'une anomalie confirmée**
Une anomalie est créée uniquement si le responsable confirme une différence ou une dégradation déclarée au départ ou au retour. La tentative de modification déclenche l'alerte et la demande de confirmation, mais elle ne crée pas encore une anomalie authentifiée et ne change pas l'état officiel du matériel.
**RG21 — Association de l'anomalie**
Chaque anomalie doit être associée à l'étudiant concerné, au matériel, à l'emprunt et aux éléments de checklist concernés.
@@ -103,7 +112,7 @@ Le responsable matériel peut consulter une anomalie, ajouter une observation et
## 7. Notifications
**RG24 — Création automatique d'une notification**
Lors de la création d'une anomalie, une notification est créée automatiquement et adressée au responsable matériel concerné.
Une notification est créée pour les responsables du campus dès la première modification d'une checklist préremplie au départ ou au retour. Les confirmations d'anomalie et les changements d'état officiel du matériel sont également signalés et historisés. Une seule demande active doit regrouper les modifications d'une même checklist afin d'éviter les alertes en double.
**RG25 — Persistance et lecture des notifications**
Les notifications sont enregistrées en base, consultables a posteriori, et peuvent être marquées comme lues par leur destinataire.
@@ -113,19 +122,19 @@ Les notifications sont enregistrées en base, consultables a posteriori, et peuv
## 8. Supervision par le responsable matériel
**RG26 — Périmètre de supervision**
Le responsable matériel agit a posteriori et n'intervient pas en temps réel dans le parcours étudiant. Son rôle est la supervision, la gestion du stock et le traitement des anomalies.
Le responsable matériel intervient lorsqu'un étudiant déclare un écart par rapport à une checklist préremplie. Il confirme ou refuse ce changement avant toute modification de l'état officiel du matériel. Il assure également la supervision, la gestion du stock et le traitement des anomalies.
**RG27 — Filtrage par campus**
Un responsable matériel ne peut consulter que les données (matériels, emprunts, anomalies, historique) du campus auquel il est rattaché.
**RG28 — Consultation des emprunts**
Le responsable matériel peut consulter les emprunts en cours, en retard, clôturés et les retours non conformes.
Le responsable matériel peut consulter les écarts en attente de confirmation au départ ou au retour, les emprunts en cours, en retard, clôturés, annulés et les retours non conformes.
**RG29 — Consultation du stock**
Le responsable matériel peut consulter l'état du stock et les statuts des matériels.
**RG30 — Gestion du matériel et des accessoires**
Le responsable matériel peut gérer les matériels, les accessoires associés, les checklists liées et faire évoluer les statuts.
Le responsable matériel peut gérer les matériels, les accessoires associés, confirmer les écarts de checklist et faire évoluer les statuts. Une différence déclarée par un étudiant ne peut modifier l'état officiel du matériel que dans le cadre des confirmations prévues par RG12A et RG19.
**RG31 — Consultation de l'historique**
Le responsable matériel peut consulter l'historique des emprunts, restitutions, anomalies et changements de statut.
@@ -135,7 +144,7 @@ Le responsable matériel peut consulter l'historique des emprunts, restitutions,
## 9. Historique et traçabilité
**RG32 — Historisation des actions importantes**
Toute opération importante doit être enregistrée dans l'historique : identification d'un étudiant, création d'un emprunt, validation des checklists, restitution, comparaison, création d'une anomalie, changement de statut d'un matériel et traitement d'une anomalie.
Toute opération importante doit être enregistrée dans l'historique : identification d'un étudiant, confirmation automatique d'une checklist inchangée, tentative de modification, validation ou refus du responsable, restitution, création d'une anomalie, changement de statut d'un matériel et traitement d'une anomalie.
**RG33 — Informations conservées dans l'historique**
L'historique doit conserver la date, l'heure, l'utilisateur concerné, le matériel concerné, le poste utilisé, la salle de prêt, le campus et l'action réalisée.
@@ -144,10 +153,8 @@ L'historique doit conserver la date, l'heure, l'utilisateur concerné, le matér
## Résumé
Les règles métier du nouveau workflow EME reposent sur un principe d'**autonomie de l'étudiant**.
Les règles métier du workflow EME reposent sur un **parcours automatique tant que l'étudiant ne déclare aucun écart**.
L'étudiant emprunte ou restitue son matériel depuis un poste dédié, s'identifie par QR code ou mail ENSUP, complète une checklist au départ et au retour, puis le système compare automatiquement les informations saisies.
Au départ, la checklist est préremplie avec l'état de référence du matériel. Une confirmation sans modification active automatiquement l'emprunt. Toute différence déclarée réserve le matériel, alerte le responsable et reste provisoire jusqu'à sa décision.
En cas de différence, une anomalie est créée automatiquement et une notification est envoyée au responsable matériel. L'ensemble des opérations est historisé afin de garantir la traçabilité.
Le responsable matériel agit **a posteriori** : il consulte, traite les anomalies, gère le stock et l'historique de son campus, sans intervenir en temps réel dans le parcours étudiant.
Au retour, la checklist reprend automatiquement l'état validé au départ. Une restitution inchangée est clôturée automatiquement. Dès que l'étudiant tente de modifier cet état, le responsable est alerté et doit confirmer le changement avant la création de l'anomalie et la mise à jour de l'état officiel. La catégorie reste bloquée tant que l'emprunt précédent n'est pas clôturé.
+22 -15
View File
@@ -554,8 +554,8 @@ html,body{height:100%;font-family:var(--body);background:#f8fafc;color:var(--tex
</div>
<div class="cl-row">
<span>Câble HDMI</span>
<div class="cb-wrap"><div class="cb" id="cd-4-p" onclick="toggleCb('cd-4','p')"></div></div>
<div class="cb-wrap"><div class="cb no" id="cd-4-a" onclick="toggleCb('cd-4','a')"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="var(--red)" stroke-width="3"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></div></div>
<div class="cb-wrap"><div class="cb ok" id="cd-4-p" onclick="toggleCb('cd-4','p')"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="var(--green)" stroke-width="3"><polyline points="20 6 9 17 4 12"/></svg></div></div>
<div class="cb-wrap"><div class="cb" id="cd-4-a" onclick="toggleCb('cd-4','a')"></div></div>
<div class="cb-wrap"><div class="cb" id="cd-4-d" onclick="toggleCb('cd-4','d')"></div></div>
</div>
</div>
@@ -563,12 +563,12 @@ html,body{height:100%;font-family:var(--body);background:#f8fafc;color:var(--tex
<div style="display:flex;flex-direction:column;gap:14px;">
<div class="instr-box">
<div class="lbl" style="margin-bottom:8px;">Instructions</div>
<p>Vérifiez physiquement chaque élément présent dans le kit. Cliquez sur <strong>Présent</strong>, <strong>Absent</strong> ou <strong>Détérioré</strong> pour chaque élément. Signalez tout élément manquant ou endommagé pour éviter tout litige au retour.</p>
<p>La checklist est préremplie avec l'état de référence. Vérifiez physiquement chaque élément et ne modifiez une valeur que si vous constatez un élément manquant ou endommagé. Toute modification alertera un responsable.</p>
</div>
<textarea class="textarea" placeholder="Commentaire ou observation optionnelle..." rows="4"></textarea>
<button class="btn btn-dark btn-lg full" onclick="goTo('s-confirmation')">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M9 11l3 3L22 4"/></svg>
Valider la checklist et confirmer l'emprunt
Confirmer l'état de départ
</button>
</div>
</div>
@@ -590,7 +590,7 @@ html,body{height:100%;font-family:var(--body);background:#f8fafc;color:var(--tex
<svg width="34" height="34" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2.5"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>
</div>
<div class="success-title">Emprunt enregistré !</div>
<div class="success-sub">Votre emprunt a bien été enregistré. Vous pouvez récupérer le matériel.</div>
<div class="success-sub">La checklist n'a pas été modifiée. L'emprunt est actif et vous pouvez récupérer le matériel.</div>
</div>
<div class="recap-card">
<div class="recap-label">Récapitulatif de l'emprunt</div>
@@ -600,7 +600,8 @@ html,body{height:100%;font-family:var(--body);background:#f8fafc;color:var(--tex
<div class="rrow"><span class="rk">Date d'emprunt</span><span class="rv">28/05/2026</span></div>
<div class="rrow"><span class="rk">Heure</span><span class="rv">09:15</span></div>
<div class="rrow"><span class="rk">Campus</span><span class="rv">Paris · Ensitech</span></div>
<div class="rrow"><span class="rk">Note</span><span class="rv" style="color:var(--orange);">Câble HDMI absent au départ</span></div>
<div class="rrow"><span class="rk">Statut</span><span class="rv">En cours</span></div>
<div class="rrow"><span class="rk">État de départ</span><span class="rv" style="color:var(--green);">Conforme à l'état de référence</span></div>
</div>
<button class="btn btn-primary full btn-lg" onclick="goTo('s-home-student')">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/></svg>
@@ -692,17 +693,23 @@ html,body{height:100%;font-family:var(--body);background:#f8fafc;color:var(--tex
<div class="cb-wrap"><div class="cb" id="cr-3-a" onclick="toggleCb('cr-3','a')"></div></div>
<div class="cb-wrap"><div class="cb" id="cr-3-d" onclick="toggleCb('cr-3','d')"></div></div>
</div>
<div class="cl-row">
<span>Câble HDMI</span>
<div class="cb-wrap"><div class="cb ok" id="cr-4-p" onclick="toggleCb('cr-4','p')"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="var(--green)" stroke-width="3"><polyline points="20 6 9 17 4 12"/></svg></div></div>
<div class="cb-wrap"><div class="cb" id="cr-4-a" onclick="toggleCb('cr-4','a')"></div></div>
<div class="cb-wrap"><div class="cb" id="cr-4-d" onclick="toggleCb('cr-4','d')"></div></div>
</div>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:14px;">
<div class="instr-box">
<div class="lbl" style="margin-bottom:8px;">Rappel checklist de départ</div>
<p>Au départ : Chargeur ✗ absent · Souris présente · Housse présente · Câble HDMI ✗ absent</p>
<div class="lbl" style="margin-bottom:8px;">État validé au départ</div>
<p>La checklist de retour est préremplie automatiquement : Chargeur présent · Souris présente · Housse présente · Câble HDMI présent. Modifiez uniquement l'élément dont l'état a changé.</p>
</div>
<textarea class="textarea" placeholder="Commentaire optionnel..." rows="4"></textarea>
<button class="btn btn-dark btn-lg full" onclick="goTo('s-anomalie')">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M9 11l3 3L22 4"/></svg>
Valider le retour
Signaler le changement et restituer
</button>
</div>
</div>
@@ -725,20 +732,20 @@ html,body{height:100%;font-family:var(--body);background:#f8fafc;color:var(--tex
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="var(--red)" stroke-width="2.5"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
</div>
<div class="alert-body">
<strong>Retour non conforme — Anomalie détectée</strong>
<p>Une différence a été constatée avec la checklist de départ. Une anomalie a été créée automatiquement et le responsable matériel a été notifié.</p>
<strong>Retour en attente de contrôle</strong>
<p>Le chargeur a été modifié de « Présent » à « Absent ». Le responsable matériel a été alerté et doit confirmer ou refuser ce changement avant toute mise à jour de l'état officiel.</p>
</div>
</div>
<div class="detail-box">
<div class="lbl" style="margin-bottom:12px;">Détail de l'anomalie</div>
<div class="lbl" style="margin-bottom:12px;">Changement en attente de confirmation</div>
<div class="drow"><span class="dk">Élément concerné</span><span class="dv" style="color:var(--red);">Chargeur 65W</span></div>
<div class="drow"><span class="dk">Statut au départ</span><span class="dv"><span class="pill p-closed">Non renseigné (absent au départ)</span></span></div>
<div class="drow"><span class="dk">Statut au départ</span><span class="dv"><span class="pill p-closed">Présent</span></span></div>
<div class="drow"><span class="dk">Statut au retour</span><span class="dv"><span class="pill p-no">Absent</span></span></div>
<div class="drow"><span class="dk">Matériel</span><span class="dv">PC Dell Latitude 5420 · ENS-PC-001</span></div>
<div class="drow"><span class="dk">Emprunteur</span><span class="dv">Lucas Martin</span></div>
<div class="drow"><span class="dk">Date détection</span><span class="dv">28/05/2026 · 10:30</span></div>
</div>
<div style="font-size:13px;color:var(--muted);text-align:center;line-height:1.6;padding:0 16px;">Le responsable matériel traitera cette anomalie. Vous pouvez retourner à l'accueil.</div>
<div style="font-size:13px;color:var(--muted);text-align:center;line-height:1.6;padding:0 16px;">L'anomalie et le nouvel état du matériel ne seront enregistrés qu'après confirmation du responsable. La catégorie reste bloquée jusque-là.</div>
<button class="btn btn-primary full btn-lg" onclick="goTo('s-home-student')">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/></svg>
Retour à l'accueil
@@ -1057,4 +1064,4 @@ function toggleCb(group, type) {
}
</script>
</body>
</html>
</html>