diff --git a/CLAUDE.md b/CLAUDE.md index 4141364..00bb51f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -39,6 +39,6 @@ pnpm + Turborepo. `apps/api` : NestJS, Prisma, PostgreSQL (pgvector + PostGIS), - ✅ **R0.11 `apps/web`** : React 19 + Vite + Tailwind v4, `tokens.css` copié tel quel + classes extraites de la maquette validée, Manrope auto-hébergée ; connexion + sélecteur démo (masqué si 404 — une seule source de vérité : l'API), coquille sidebar (rail safran, écrans futurs marqués R1-R3) / topbar (thème, chip DÉMO, sélecteur de rôle), page /design ; client typé `schema.d.ts` généré depuis `docs/openapi.json` et committé ; vérifié en navigateur réel (bascule de rôle 101 ms, bi-thème, 0 erreur console). - ✅ **R0.12 — tests + CI** (5 jobs verts) : `lint` (ESLint 10 flat config racine, règle ADR-001 anti-import MinIO codée et vérifiée), `ci-contract` (régénération spec+client, diff bloquant), `api` (PostgreSQL 18 + Redis, migrate deploy, Jest couverture ≥ 70 % bloquante — mesurée 97,5 %), `web` (typecheck + vitest + build), `e2e` (Playwright : parcours démo, bascule < 3 s chronométrée, déconnexion). Badge au README. - ✅ **R0.13 — Dockerfiles + runbook Dokploy** : image api (multi-stage pnpm deploy, `prisma migrate deploy` au boot, seed optionnel `SEED_ON_START`, non-root, healthcheck ; `binaryTargets` explicites) ; image web (nginx, proxy `/api` résolu à la requête, fallback SPA, cache assets) ; `infra/docker-compose.dokploy.yml` (5 services `siop2-`, seul le web sur `dokploy-network`) ; runbook `docs/06-production/runbook-dokploy.md`. **Répétition locale complète validée** (migrate+seed au boot, parcours via nginx conteneurisé, double verrou ADR-002 observé). Le déploiement réel attend les accès au serveur du partenaire. -- 🚀 **R0 EN PRODUCTION (16/07/2026)** : `https://siop2.apps.enset.top` (Dokploy ENSET, profil démo, vérifiée : health ok, 7 comptes, demo-login, 401 sans jeton, HTTPS). La production client SPELEV attend les accès au serveur du partenaire. -- 🔄 **R0 — reste** : secret `DOKPLOY_WEBHOOK_URL` pour activer le CD (runbook §4), sauvegardes PostgreSQL Dokploy, recette R0 avec le référent (revue pixel écrans ↔ maquettes) → ouverture de R1 Référentiel. +- ✅ **R0 CLOSE** (tag `release/r0`) — en production : `https://siop2.apps.enset.top` (Dokploy ENSET, profil démo, vérifiée en ligne). Restes non bloquants : secret `DOKPLOY_WEBHOOK_URL` (CD), sauvegardes PostgreSQL Dokploy. Production client SPELEV : attend les accès au serveur du partenaire. +- 🔄 **R1 Référentiel — ouverte, design d'abord** : `docs/02-design/maquettes/maquette-r1.html` (7 écrans : sites+carte, fiche site, ascenseurs, création, étiquette QR, personnes & équipes, catégories) — **⛔ en attente de validation du référent avant tout code R1**. Ensuite : modèle de données R1 (Location PostGIS, Asset+organes, Category, Team, invitation/activation) → API → web → tests/e2e → déploiement. - Détail quotidien : `docs/journal/journal.md`. Dépôt : `siop-spelev/siop2` (privé), jalons R0→R5. diff --git a/docs/02-design/maquettes/maquette-r1.html b/docs/02-design/maquettes/maquette-r1.html new file mode 100644 index 0000000..5d4fafb --- /dev/null +++ b/docs/02-design/maquettes/maquette-r1.html @@ -0,0 +1,863 @@ + + +
+ + +Intention : le parc vu par la géographie — liste dense à gauche, carte PostGIS à droite (Leaflet/OSM dans l'app). Un site en alerte (OT « personne bloquée ») porte un pin rouge. La hiérarchie fine (halls, sous-sols) vit dans la fiche site, pas ici.
+| Site | Ascenseurs | Gardien | OT ouverts |
|---|---|---|---|
| Tour AtlasBd de la Corniche, Casablanca | 6 | Karim Doukkali | 1 urgence |
| Résidence Al ManarBd Hassan II, Mohammedia | 4 | Hassan Alami | 2 |
| Anfa PlaceBd de l'Océan Atlantique, Casablanca | 5 | — | 1 |
| Clinique YasmineRue Ibn Rochd, Casablanca | 3 | Rachid Mansouri | 0 |
| Marina CenterAv. des FAR, Mohammedia | 2 | — | 0 |
Intention : l'adresse, le contact terrain et la hiérarchie d'emplacements (site → hall/zone) avec les appareils rattachés. Règle métier : un ascenseur est rattaché à un emplacement ; un organe, lui, n'a jamais d'emplacement propre (il suit son ascenseur).
+Intention : l'inventaire du parc, table dense « bureau ». Le statut d'équipement (En service / À l'arrêt / En maintenance) est distinct des statuts d'OT — un appareil à l'arrêt saute aux yeux. Référence cliquable → fiche validée en R0.
+| Appareil | Marque · modèle | Site / emplacement | Catégorie | Statut | Prochaine grille |
|---|---|---|---|---|---|
| B2 | Schindler 3300 | Tour AtlasTour bureaux | Électrique | À l'arrêt | Personne bloquée |
| A1 | Otis Gen2 Premier | Résidence Al ManarHall principal | Électrique | En service | 1 août |
| C1 | Kone MonoSpace 500 | Anfa PlaceGalerie commerciale | Électrique | En service | 1 août |
| M1 | Kone TranSys | Tour AtlasParking sous-sol | Monte-charge | En maintenance | 12 août |
| D1 | ThyssenKrupp Evolution | Clinique YasmineBloc A | Électrique | En service | 3 août |
| E2 | Otis HydroFit | Marina CenterHall B | Hydraulique | En service | 9 août |
Intention : le parcours de recette R1 — identité, rattachement (site → emplacement), puis organes ajoutés ligne à ligne. Un organe n'a pas d'emplacement propre : il suit son appareil (contrainte en base). Le QR est généré à la création.
+Intention : l'étiquette imprimable (A6, encre noire sur blanc — lisible et économique) collée en cabine : la marque, le QR, la consigne pour le gardien. Fond toujours blanc, même en thème sombre : c'est un objet papier.
+Intention : l'admin invite (jamais de mot de passe créé pour autrui) : lien d'activation 7 jours, statut « Invitation envoyée » jusqu'à activation. Les équipes regroupent les techniciens par zone — l'assignation d'OT (R2) s'appuiera dessus. La modale est montrée ouverte.
+| Personne | Rôle | Équipe | Statut | |
|---|---|---|---|---|
SI Salma Idrissisalma@spelev.ma | Dispatcher | — | Actif | |
AB Ahmed Benaliahmed@spelev.ma | Technicien | Casablanca Centre | Actif | |
FZ Fatima-Zahra Idrissifz.idrissi@spelev.ma | Technicienne | Mohammedia | Invitation envoyée | |
YT Youssef Taziy.tazi@spelev.ma | Technicien limité | Casablanca Centre | Actif | |
KD Karim Doukkaligardien · Tour Atlas | Demandeur | — | Actif |
Intention : les référentiels administrables du parc — catégories d'équipement et types d'organes. Simples listes : renommer, ajouter, désactiver (jamais supprimer si utilisé). Les référentiels du bilan codé arriveront en R2 sur le même modèle.
+