feat(r2.3): écrans web exploitation — OT, demandes, préventif, compteurs, urgence

- liste OT (filtres, strie rouge, « immédiat ») ; fiche OT : transitions
  pilotées par allowedTransitions, clôture grisée avec la garde expliquée,
  bilan codé (6 selects sur référentiels), checklist Fait→N-A→à faire,
  activité + commentaires, assignation, annulation motivée
- nouvel OT : interrupteur « personne bloquée » qui force la priorité
- demandes : table + panneau d'approbation (priorité, assignation,
  approuver → fiche OT), rejet en modale à motif obligatoire, signalement
  interne ; statut « Résolue » dérivé de l'OT lié
- préventif : tuiles réelles, générer + résumé (« regénérer ne double
  rien »), gabarits administrables ; compteurs : saisie + historique
- tableau de bord réel : bandeau urgence cliquable, KPIs, OT par statut,
  interventions récentes ; accueil dédié aux rôles sans exploitation
- urgence traversante : chip topbar pulsante (60 s), badges de nav
- GET /assets/options (auth seule) : le Demandeur peut désigner l'appareil
  qu'il signale — trou débusqué par l'e2e (49 opérations au contrat)
- génération préventive durcie : collision de référence RETENTÉE (plus de
  saut silencieux), P2003 toléré ; 3 runs Jest complets consécutifs verts
- 9 tests Playwright (recette R2 officielle rejouée intégralement),
  50 tests API (94,6 % / 78,9 %)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
pr-daaif
2026-07-16 17:13:20 +01:00
parent 902efa6192
commit 6a2dae1710
26 changed files with 2274 additions and 93 deletions

View File

@@ -456,6 +456,32 @@
}
}
},
"/assets/options": {
"get": {
"operationId": "listAssetOptions",
"summary": "Options dappareils pour le signalement (tout rôle authentifié)",
"tags": [
"assets"
],
"security": [
{
"bearerAuth": []
}
],
"responses": {
"200": {
"description": "Options",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AssetOptionsResponse"
}
}
}
}
}
}
},
"/assets/{id}": {
"get": {
"operationId": "getAsset",
@@ -2692,6 +2718,41 @@
],
"additionalProperties": false
},
"AssetOptionsResponse": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"reference": {
"type": "string"
},
"siteName": {
"type": "string"
}
},
"required": [
"id",
"reference",
"siteName"
],
"additionalProperties": false
}
}
},
"required": [
"options"
],
"additionalProperties": false
},
"AssetDetail": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",