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 @@ + + + + + +SIOP V2 — Maquettes HD · R1 Référentiel + + + + + + + +
+ SIOP V2 · Maquettes R1 — Référentiel + +
+
+ + +

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.

+
+
+
+
+
Rechercher un site, une ville…
+
DÉMOSI +
Salma Idrissi
Dispatcher ▾
+
+
+
+

Sites

12 sites · 34 ascenseurs +
+
+
+ Ville : Toutes + Trier : Ascenseurs ↓ +
+
+
+
+ + + + + + + + +
SiteAscenseursGardienOT ouverts
Tour AtlasBd de la Corniche, Casablanca6Karim Doukkali1 urgence
Résidence Al ManarBd Hassan II, Mohammedia4Hassan Alami2
Anfa PlaceBd de l'Océan Atlantique, Casablanca51
Clinique YasmineRue Ibn Rochd, Casablanca3Rachid Mansouri0
Marina CenterAv. des FAR, Mohammedia20
+
+
+
+
+
+
Tour Atlas · 6
+
Al Manar · 4
+
Anfa Place · 5
+
Clinique Yasmine · 3
+
Carte : OpenStreetMap (app) — positions PostGIS
+
+
+
+
+
+
+ + + +
+
+
+
+
Rechercher…
+
DÉMOSI +
Salma Idrissi
Dispatcher ▾
+
+
+
Sites / Tour Atlas
+
+

Tour Atlas

1 urgence en cours +
+ + +
+
+
+
+

Identité

+
+
Adresse
Bd de la Corniche, Aïn Diab — Casablanca
+
Position
33.6062 N · 7.6706 O (posée sur la carte)
+
Gardien
Karim Doukkali · 06 61 23 45 67
+
Syndic
Atlas Property Management
+
Contrat
Actif · 6 appareils au préventif
+
+
+
+
+
Tour Atlas
+
OSM (app)
+
+
+
+
+

Emplacements & appareils

+
    +
  • Tour Atlassite6 appareils
  • +
  • Hall principalzoneAsc. A1 · A2
  • +
  • Tour bureaux (étages 1-24)zoneAsc. B1 · B2 ⚠
  • +
  • Parking sous-solzoneMonte-charge M1
  • +
  • Résidence (aile est)zoneAsc. C1
  • +
+ +
+
+

Ascenseurs du site

+ + + + +
+
+
+
+
+
+ + + +
+
+
+
+
Rechercher un appareil, un n° de série…
+
DÉMOSI +
Salma Idrissi
Dispatcher ▾
+
+
+
+

Ascenseurs

34 appareils · 2 à l'arrêt +
+ + +
+
+
+ Site : Tous + Statut : Tous + Catégorie : Toutes + Marque : Toutes +
+
+
+ + + + + + + + + +
AppareilMarque · modèleSite / emplacementCatégorieStatutProchaine grille
B2Schindler 3300Tour AtlasTour bureauxÉlectriqueÀ l'arrêtPersonne bloquée
A1Otis Gen2 PremierRésidence Al ManarHall principalÉlectriqueEn service1 août
C1Kone MonoSpace 500Anfa PlaceGalerie commercialeÉlectriqueEn service1 août
M1Kone TranSysTour AtlasParking sous-solMonte-chargeEn maintenance12 août
D1ThyssenKrupp EvolutionClinique YasmineBloc AÉlectriqueEn service3 août
E2Otis HydroFitMarina CenterHall BHydrauliqueEn service9 août
+
+
+
+
+
+ + + +
+
+
+
+
Rechercher…
+
DÉMOSI +
Salma Idrissi
Dispatcher ▾
+
+
+
Ascenseurs / Nouvel ascenseur
+

Nouvel ascenseur

+
+

1 · Identité

+
+
+
+
Schindler
+
+
+
Ascenseur électrique
+
+
+
+
+
+

2 · Rattachement

+
+
Tour Atlas
+
Tour bureaux (étages 1-24)
+
+
+
+

3 · Organes — suivis individuellement (pannes par organe, essais réglementaires)

+
Portes cabine
Fermator 40/10
+
Treuil
Schindler FMB130
+
Parachute
Désignation…
+ +
+
+ + +
+
+
+
+
+ + + +
+
+
+
+
Rechercher…
+
DÉMOSI +
Salma Idrissi
Dispatcher ▾
+
+
+
Ascenseurs / Ascenseur A1 / Étiquette QR
+
+

Étiquette cabine — Ascenseur A1

+
+ + +
+
+
+
+

SIOPMaintenance d'ascenseurs
SPELEV · 05 22 00 00 00
+
+ + + + + + + + + + + + + + +
+

Ascenseur A1

+
Résidence Al Manar
Hall principal — Mohammedia
+
+
+
Un problème ? Une personne bloquée ?
📱 Scannez ce code pour signaler
+
SIOP · A1 · OT-2020-4521 · siop2.apps.enset.top/q/a1
+
+
+

Ce que fait le scan

+
+
Gardien
ouvre le portail de signalement, équipement prérempli (écran validé R0)
+
Technicien
connecté → ouvre la fiche de l'appareil
+
Impression
A6 autocollant, noir sur blanc — testée à 300 dpi
+
+
+
+
+
+
+
+ + + +
+
+
+
+
Rechercher une personne…
+
DÉMOYA +
Yasmine Alaoui
Administratrice ▾
+
+
+
+

Personnes & équipes

+
+ + +
+
+
+
+ + + + + + + + +
PersonneRôleÉquipeStatut
SI
Salma Idrissisalma@spelev.ma
DispatcherActif
AB
Ahmed Benaliahmed@spelev.ma
TechnicienCasablanca CentreActif
FZ
Fatima-Zahra Idrissifz.idrissi@spelev.ma
TechnicienneMohammediaInvitation envoyée
YT
Youssef Taziy.tazi@spelev.ma
Technicien limitéCasablanca CentreActif
KD
Karim Doukkaligardien · Tour Atlas
DemandeurActif
+
+
+

Équipes

+
+
Casablanca CentreTour Atlas · Anfa Place · Clinique Yasmine
ABYT
+
MohammediaRésidence Al Manar · Marina Center
FZ
+
+ Nouvelle équipe
+
+
+
+
+

Inviter une personne

+
+
+
Technicien
+
Casablanca Centre
+
+
+ La personne recevra un lien d'activation valable 7 jours pour choisir son mot de passe. Aucun compte n'est actif avant cela. +
+
+
+
+
+
+
+
+ + + +
+
+
+
+
Rechercher…
+
DÉMOYA +
Yasmine Alaoui
Administratrice ▾
+
+
+

Catégories

+
+
+

Catégories d'équipement

+
Ascenseur électrique26 appareils · Renommer
+
Ascenseur hydraulique4 · Renommer
+
Monte-charge3 · Renommer
+
EPMR (plateforme PMR)1 · Renommer
+
+
+
+

Types d'organes

+
Portes cabine / palières34
+
Treuil / machinerie34
+
Parachute31
+
Armoire de commande34
+
Boutons & signalisation29
+
Limiteur de vitesse (désactivé)Réactiver
+
+
+
+
+ Une catégorie utilisée ne peut pas être supprimée — seulement renommée ou désactivée (elle disparaît des sélecteurs, l'historique reste lisible). +
+
+
+
+
+ + + + diff --git a/docs/journal/journal.md b/docs/journal/journal.md index 22037d3..0aef5f2 100644 --- a/docs/journal/journal.md +++ b/docs/journal/journal.md @@ -4,6 +4,25 @@ Trace chronologique des sessions (la plus récente en premier). Le **playbook** --- +## 2026-07-16 — Pr. Daaif (+ Claude) — R0 CLOSE (tag) · R1 ouverte : maquettes à valider + +**Actions** + +- **R0 close** : recette prononcée par le référent, tag `release/r0` poussé (DoD complète : CI verte, revue pixel, production en ligne, journal). +- **R1 « Référentiel » ouverte — design d'abord** (principe n°1) : `maquette-r1.html` produite dans le moule validé (CSS répliquée de `maquette-web.html`, mêmes tokens/typo/motifs) — **7 écrans** : Sites (liste + carte PostGIS), Fiche site (hiérarchie d'emplacements), Ascenseurs (liste, statuts d'équipement distincts des statuts OT), Nouvel ascenseur (identité → rattachement → organes), Étiquette QR imprimable (A6 papier, blanche même en thème sombre), Personnes & équipes (invitation par lien d'activation 7 jours, modale montrée), Catégories (référentiels administrables, jamais de suppression si utilisé). +- Rendu vérifié en Chrome headless : 7 écrans + 2 contrôles thème sombre, zéro erreur. + +**Décisions (proposées à la validation)** + +- Statuts d'équipement (En service / À l'arrêt / En maintenance) **distincts** des statuts OT ; l'appareil à l'arrêt porte la strie rouge. +- Un organe **n'a jamais d'emplacement propre** : il suit son appareil (contrainte en base, comme en v1). +- Invitation par **lien d'activation** (7 jours) — aucun mot de passe créé pour autrui ; compte inactif avant activation. +- Catégorie utilisée : renommage/désactivation seulement, jamais de suppression. + +**⛔ Bloquant** : validation des maquettes R1 par le référent avant toute ligne de code applicatif R1. + +--- + ## 2026-07-16 — Pr. Daaif (+ Claude) — 🚀 R0 EN PRODUCTION : **Actions**