diff --git a/CLAUDE.md b/CLAUDE.md index 9b94900..d7cf3d5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -48,6 +48,6 @@ pnpm + Turborepo. `apps/api` : NestJS, Prisma, PostgreSQL (pgvector + PostGIS), - ✅ **R2.1 — socle backend exploitation** : migration `r2_exploitation` (10 tables), 15 opérations au contrat (41 total, transitions + champs requis du bilan dans `@siop/shared`), machine à états stricte avec garde de clôture (bilan 3 champs + checklist), demande→OT 1-1, rejet à motif, scoping « voir autre » (listes + accès directs), seed maquette (31 valeurs de bilan, 8 gabarits, OT/demandes/compteurs), 45 tests (95 %/79 %). - ✅ **R2.2 — préventif + compteurs** : `underContract` + `periodKey` (unicité `[assetId, periodKey]` = idempotence EN BASE), génération mensuelle (ancrage mise en service, premier contrôle, gabarits administrables, statut du mois), compteurs strictement croissants ; +7 opérations (48), 50 tests (94,7 %/78 %). Automatisation cron/BullMQ notée pour le durcissement production. - ✅ **R2.3 — écrans web exploitation** : liste/fiche OT (transitions via `allowedTransitions`, garde visible, bilan codé, checklist cliquable, activité), demandes+approbation/rejet motivé, nouvel OT (interrupteur urgence), préventif (tuiles+générer+gabarits), compteurs, tableau de bord réel, urgence traversante (chip topbar, badges, bandeau) ; `GET /assets/options` (trou Demandeur corrigé) ; retry sur collision de référence dans la génération ; 9 Playwright verts (recette R2 complète), 50 tests API. -- ✅ **R2.4 — portail public QR** : `/q/{réf}` sans compte (écran validé R0, mobile d'abord), 3 routes publiques `/portal` throttlées, suivi par jeton opaque (`Request.publicToken`, jamais de liste exposée), étapes Reçu → Intervention → Résolu dérivées de l'OT ; boucle produit complète en e2e (11 Playwright verts, 52 opérations). -- 🔄 **R2 — reste pour clore** : recette R2 avec le référent (revue pixel ↔ maquettes R0+R2, sur `pnpm dev` ou l'instance en ligne après déploiement), tag `release/r2` → ouverture R3 Gestion (stock, BC, tiers, main-d'œuvre, analytics, bibliothèque — maquettes à produire d'abord). +- 🏁 **R2 CLOSE (16/07/2026, tag `release/r2`)** : recettée (1 anomalie corrigée en recette : tri « Interventions récentes »), déployée et vérifiée en ligne (portail `/q/A1`, urgence en tête, préventif de juillet généré). +- 🔄 **R3 Gestion — ouverte, design d'abord** : `maquette-r3.html` (7 écrans : stock dérivé des mouvements, fiche pièce, BC avec réception→entrées, coûts sur OT à prix/taux figés, statistiques, tiers, bibliothèque) — **⛔ en attente de validation du référent avant tout code R3** (4 décisions soumises). Ensuite : modèle R3 (Part/StockMovement, PurchaseOrder, Partner, LaborTime taux figé, Document + upload FileStorage réel) → contrat → API → web → recette (consommer sous seuil → BC → réception ; coût complet d'un OT ; dashboard direction). - 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-r3.html b/docs/02-design/maquettes/maquette-r3.html new file mode 100644 index 0000000..448fd2c --- /dev/null +++ b/docs/02-design/maquettes/maquette-r3.html @@ -0,0 +1,840 @@ + + +
+ + +Intention : le stock est DÉRIVÉ des mouvements (décision v1 éprouvée) — jamais de champ « quantité » éditable. Sous le seuil : strie ambre + alerte, et le bouton « préparer le BC » prérempli. Prix unitaire = dernier prix d'achat (figé à chaque consommation).
+| Réf. | Désignation | Stock | Seuil | Dernier PU | Fournisseur | |
|---|---|---|---|---|---|---|
| P-0113 | Contact de porte NC-31 | 2 | 5 | 85 MAD | Ascentech Maroc | Sous le seuil · Préparer le BC |
| P-0087 | Coulisseau de guide 16 mm | 4 | 6 | 120 MAD | Ascentech Maroc | Sous le seuil · Préparer le BC |
| P-0042 | Graisse guide (cartouche 400 g) | 18 | 8 | 85 MAD | Lubmaroc | |
| P-0031 | Bouton palier lumineux Ø22 | 26 | 10 | 45 MAD | Ascentech Maroc | |
| P-0019 | Cellule barrière porte (paire) | 7 | 4 | 640 MAD | SchindlerParts |
Intention : l'histoire d'une pièce — chaque ligne de stock vient d'un mouvement daté, tracé, motivé (réception BC, consommation OT, ajustement). Le lien vers l'OT ou le BC est toujours cliquable.
+| Date | Mouvement | Qté | Origine |
|---|---|---|---|
| 14 juil. | − Sortie | 1 | OT-2026-0336 · Ahmed |
| 2 juil. | − Sortie | 2 | OT-2026-0329 · Fatima-Zahra |
| 12 juin | + Réception | 5 | BC-2026-0021 · 85 MAD/u |
| 3 mai | − Ajustement | 1 | Inventaire — pièce endommagée (Nadia) |
Intention : le circuit d'achat minimal : Brouillon → Envoyé → Reçu. La réception crée les mouvements d'entrée (et fige le PU). Le BC préparé depuis une alerte arrive prérempli.
+| N° | Fournisseur | Lignes | Total | Statut |
|---|---|---|---|---|
| BC-2026-0024 | Ascentech Maroc | 2 | 1 105 MAD | Envoyé |
| BC-2026-0023 | SchindlerParts | 1 | 1 280 MAD | Brouillon |
| BC-2026-0021 | Ascentech Maroc | 3 | 1 940 MAD | Reçu |
| BC-2026-0019 | Lubmaroc | 1 | 850 MAD | Reçu |
| Pièce | Qté | PU | Total |
|---|---|---|---|
| Contact de porte NC-31 | 10 | 85 | 850 |
| Coulisseau de guide 16 mm | 2 | 127,50 | 255 |
La réception crée un mouvement d'entrée par ligne et fige le PU — le stock remonte, l'alerte s'éteint.
+Intention : la carte « Pièces & main-d'œuvre » (fiche OT validée R0) devient réelle : consommer une pièce décrémente le stock et FIGE le prix ; la main-d'œuvre = heures × taux figé de la personne (géré dans Personnes). Le coût total suit l'OT pour toujours, même si prix et taux changent ensuite.
+Intention : M. Bennis lit en 30 s : coûts, pannes par organe (ENFIN alimenté par les bilans codés), taux de préventif, top équipements. Palette graphique validée CVD, étiquettes directes, chiffres tabulaires.
+| Appareil | Site | Dépannages | Pièces | Main-d'œuvre | Total |
|---|---|---|---|---|---|
| B2 | Tour Atlas | 9 | 6 420 | 3 240 | 9 660 MAD |
| A1 | Résidence Al Manar | 6 | 2 210 | 1 560 | 3 770 MAD |
| C1 | Anfa Place | 4 | 1 890 | 980 | 2 870 MAD |
Intention : l'annuaire minimal — fournisseurs de pièces et syndics/clients des sites. Un tiers se rattache aux BC (fournisseur) ou aux sites (syndic). Fiche simple, pas de CRM.
+| Nom | Type | Contact | Rattachements |
|---|---|---|---|
| Ascentech MarocCasablanca — pièces détachées | Fournisseur | M. Berrini · 05 22 34 56 78 | 2 BC en cours |
| SchindlerPartsImportateur agréé | Fournisseur | commandes@schindlerparts.ma | 1 BC en cours |
| LubmarocConsommables | Fournisseur | 05 22 11 22 33 | — |
| Atlas Property ManagementSyndic | Client / syndic | Mme Zerhouni · 06 61 98 76 54 | Tour Atlas |
| Syndic Al Manar | Client / syndic | M. Alami (gardien référent) | Résidence Al Manar |
Intention : notices, certificats et photos — rattachés à un appareil ou un OT, stockés MinIO derrière FileStorage. Types fermés, taille plafonnée, aperçu léger. La carte « Documents » des fiches devient réelle.
+