Assets & Maintenance
Assets & Maintenance
Périmètre : cycle de vie des équipements de la grande distribution alimentaire (réfrigérateurs, vitrines, chambres froides, fours, climatisation…) — entrée en stock, installation client, maintenance préventive/curative, pièces détachées, transport, reconditionnement, revente/recyclage. Inclut le référentiel marques/modèles/familles, les dépôts, le SAV public via QR code et la facturation de stockage par prestataire.
/workspace/assets/*, /workspace/maintenance*, /workspace/spare-parts, /workspace/transport/*. Routes API sous /api/workspace/assets/*, /api/workspace/maintenance/*, etc. La Phase 6 est fonctionnellement complète. Source : docs/08-domain-assets.md.Vocabulaire & entités
| Terme | Entité | Définition |
|---|---|---|
| Asset | Asset | Instance physique unique d'un équipement, identifiée par un N° inventaire et un N° de série. |
| Modèle | AssetModel | Référence catalogue (ex : « Liebherr GKv 6460 »), rattaché à une marque et une famille. |
| Marque | AssetBrand | Fabricant (ex : « Liebherr »). |
| Famille | AssetFamily | Catégorie hiérarchique (ex : Réfrigération › Armoire réfrigérée › Vitrine positive). |
| Dépôt | StorageLocation | Entrepôt physique géré par Pulse ou un prestataire logistique. |
| Lien de service | AssetServiceLink / Asset.serviceShortCode | URL courte unique imprimée sur l'asset, ouvre la page publique SAV sans login. |
| OT | MaintenanceOperation | Ordre de Travail — curatif, préventif ou inspection. |
| Mouvement | AssetMovement | Enregistrement daté de tout déplacement d'asset entre localisations. |
| Demande de transport | TransportRequest | Livraison / enlèvement / transfert inter-dépôts, rattachée à un transporteur. |
| Transporteur | Carrier | Prestataire logistique (nom, contact, capacité, agréments, assurance). |
| Pièce — référence | SparePartReference | Référence catalogue d'une pièce détachée, liée à des modèles d'asset compatibles. |
| Pièce — instance | SparePartInstance | Stock physique d'une référence de pièce (SparePartState). |
| MTBF | — | Mean Time Between Failures — calculé par modèle via job nocturne. |
| MTTR | — | Mean Time To Repair — calculé par modèle via job nocturne. |
Le schéma complet est dans
docs/04-data-model.md§6.
Écrans
| Écran | Route | Contenu |
|---|---|---|
| Liste assets | /workspace/assets | DataTable (N° inventaire, N° série, modèle, famille, états, localisation, dernière maintenance) + vue Cartes + vue Carte géo + actions de masse (étiquettes QR, transfert, recyclage, export). |
| Création asset | /workspace/assets/new | Sélecteur modèle, N° inventaire auto ou manuel, N° série, état initial, date + montant d'acquisition, localisation initiale, multi-upload photos. |
| Fiche asset | /workspace/assets/[id] | Onglets : Synthèse, Caractéristiques, Historique emplacements, Maintenance, Contrats, Pièces détachées, Fichiers, Commentaires, Audit log. |
| Marques | /workspace/assets/brands | Liste, création, édition, désactivation (unicité du nom). |
| Modèles | /workspace/assets/models | Liste, création, fiche/édition, propriétés dynamiques key/value/unit, MTBF cumulé. |
| Familles | /workspace/assets/families | Arbre hiérarchique drag-drop, édition libre. |
| Stockages | /workspace/assets/storage-locations | Liste dépôts (occupation, capacité m²/m³, liste du parc en stock). |
| Étiquettes | /workspace/assets/printing | Tâche d'impression QR / étiquettes / fiches, templates PDF, job async > 100 assets. |
| Dashboard maintenance | /workspace/maintenance-overview | 6 KPI cards : OT ouverts, en retard, MTTR moyen, taux SLA respectés, coût moyen, top modèles. |
| Planning maintenance | /workspace/maintenance-planning | Opérations ouvertes par échéance, retards en tête. |
| Liste OT | /workspace/maintenance | Kanban PLANNED/IN_PROGRESS/DONE/CANCELED + calendrier drag-drop (FullCalendar). |
| Fiche OT | /workspace/maintenance/[id] | Diagnostic, résolution, pièces utilisées, coût estimé/réel, signature client canvas, photos avant/après, PDF rapport. |
| Pièces détachées | /workspace/spare-parts | Références catalogue + instances en stock + mouvements + alertes seuil bas. |
| Transport | /workspace/transport | Kanban REQUESTED→DELIVERED, création demandes, génération BL/CMR PDF, suivi tracking. |
| Transporteurs | /workspace/transport/carriers | CRUD (nom unique par organisation). |
| SAV public | /public/asset/[shortCode] | Formulaire sans login : identité, description, photos, niveau d'urgence → crée OT curatif. |
| Suivi SAV public | /public/maintenance/[publicCode] | Consultation statut OT sans login. |
Modèle de données (points clés)
Asset.currentLocationId: référence vers l'AssetLocationcourante — mise à jour atomiquement à chaque mouvement.AssetLocation: chaque emplacement reçoitarrivedAtà la création etleftAtà la sortie (historique immuable).Asset.serviceShortCode: code 8 chars aléatoire (collision check), porté directement sur l'asset, sert de jeton public.- États physiques
AssetConditionet fonctionnelsAssetFunctional: deux enums indépendants. MaintenanceOperation.slaDueAt: calculé à la création selon la priorité du contrat (J+4h critique, J+24h normal, J+5j basse).SparePartInstance: décrémentée du stock à la complétion de l'OT (pas à l'ajout de la ligne pièce).- MTBF/MTTR : recalculés chaque nuit par job
maintenance:mtbf-refresh(vue matérialisée par modèle). StorageMovementRequest(PENDING → CONFIRMED → VERIFIED) : gère le workflow WARM'UP ; génère atomiquement lesAssetMovementà la vérification.
API
Permissions de base : assets.catalog:{read,manage}, assets.asset:{read,manage}, maintenance.operation:{read,manage}.
| Méthode | Route | Permission |
|---|---|---|
GET | /api/workspace/assets | asset:read |
GET | /api/workspace/assets/[id] | asset:read |
POST | /api/workspace/assets | asset:create |
PATCH | /api/workspace/assets/[id] | asset:update |
DELETE | /api/workspace/assets/[id] | asset:delete |
POST | /api/workspace/assets/[id]/move | asset.location:move |
POST | /api/workspace/assets/[id]/state | asset:update |
GET | /api/workspace/assets/[id]/qr.png | asset:read |
POST | /api/workspace/assets/print | asset:read |
GET / POST | /api/workspace/asset-brands | asset:read / asset.brand:manage |
GET / POST | /api/workspace/asset-models | asset:read / asset.model:manage |
GET | /api/workspace/asset-families | asset:read |
GET / POST | /api/workspace/storage-locations | asset:read / asset:update |
GET / POST | /api/workspace/maintenance | asset.maintenance:read / :create |
PATCH | /api/workspace/maintenance/[id] | asset.maintenance:update |
POST | /api/workspace/maintenance/[id]/complete | asset.maintenance:complete |
GET / POST | /api/workspace/spare-parts/references | asset:read / asset:update |
GET / POST | /api/workspace/spare-parts/instances | asset:read / asset:update |
GET / POST | /api/workspace/transport/requests | asset.transport:manage |
GET | /api/workspace/transport/carriers | asset.transport:manage |
GET | /api/public/asset/[shortCode] | (public, sans session) |
POST | /api/public/asset/[shortCode]/report-issue | (public, rate-limit strict) |
Exemple de référence d'endpoint :
/api/public/asset/[shortCode]/report-issueAuth Crée un MaintenanceOperation curatif depuis la page publique SAV (QR code scanné). Route sans session — rate-limit strict. Aucune donnée interne de l'organisation n'est exposée dans la réponse.
Corps (JSON)
Réponse
{
"maintenanceOperationId": "mop_…",
"publicCode": "SAV-2026-04217",
"trackingUrl": "https://qr.pulsegroup.fr/public/maintenance/SAV-2026-04217"
}
Workflows
Cycle de vie d'un asset
ACQUISITION (état NEW, localisation dépôt)
│
EN STOCK
│ affectation contrat LLD / vente
│
CHEZ LE CLIENT
├──→ MAINTENANCE (OT) ──→ retour dépôt
└──→ DEFAILLANT ──→ RETOUR SAV
│
RECONDITIONNEMENT
├──→ REVENTE
└──→ RECYCLAGE
À chaque transition : audit log asset.state_changed, AssetMovement créé, AssetLocation.currentLocationId mis à jour, notifications éventuelles.
OT préventif (job quotidien)
maintenance-preventive1×/j scanne lesLeaseContractactifs avec clause de maintenance.- Calcule la prochaine échéance ; si J−30 sans OT planifié → crée
MaintenanceOperation PLANNED PREVENTIVE. - Notification responsable SAV pour affectation technicien.
OT curatif
- Client via QR →
POST /api/public/asset/[shortCode]/report-issue→ OTPLANNED CURATIVE. - Portail client
/client/maintenance/new→ idem. - Interne → création depuis fiche asset.
- Notification responsable SAV → affectation technicien.
- Technicien :
IN_PROGRESSà l'arrivée, diagnostic + résolution + pièces + photos + signature client →DONE. - Rapport PDF généré, envoyé au client, archivé.
- Si coût OT > seuil configuré par org → devis exigé avant intervention.
SLA & escalade
slaDueAtcalculé à la création selon priorité contractuelle (J+4h / J+24h / J+5j).- J−1 du SLA sans
IN_PROGRESS→ notification urgence responsable SAV. - Dépassement SLA → escalade direction + email d'excuse client.
Mouvement / transfert
- Localisation
CUSTOMER_ESTABLISHMENT: exige unEstablishmentlié à unLeaseContractactif (sinon warning). - Transfert inter-dépôts → génère automatiquement une
TransportRequest TRANSFER. AssetLocationprécédente reçoitleftAt, nouvelle créée avecarrivedAt.
QR code / Lien de service
AssetServiceLinkcréé automatiquement à la création de l'asset ;shortCode8 chars (collision check).publicUrl = https://qr.pulsegroup.fr/{shortCode}— QR PNG généré à la demande (cache 30j).- Étiquette PDF générée par
buildAssetLabelPdf(N° inventaire + lien + QR code).
Reconditionnement
- Retour dépôt fin de contrat → OT
INSPECTION. - Décision :
REFURBISHED(ré-allouable) ·RECYCLED(bordereau DEEE) ·SOLD(sortie stock).
Règles métier
- N° inventaire unique par organisation. N° série unique par org s'il est renseigné.
LOST/RECYCLED→ asset non sélectionnable pour de nouveaux contrats.SOLD→ asset en lecture seule (non modifiable).- Suppression hard interdite si asset lié à un contrat ou une facture.
MaintenanceOperation IN_PROGRESSnon supprimable — annulation avec raison obligatoire.- Pièces décrémentées à la complétion de l'OT, pas à l'ajout de la ligne pièce.
- Job nocturne : recalcul
MTBF/MTTRpar modèle (vue matérialisée). - Workflow WARM'UP :
StorageMovementRequest PENDING → CONFIRMED → VERIFIED; génération atomique desAssetMovementà la vérification.
KPIs
Nombre d'assets par état · taux d'occupation par dépôt · MTBF/MTTR par modèle et par famille · taux de respect SLA SAV (% OT clos dans SLA) · coût moyen d'intervention par modèle · top 10 modèles les plus problématiques · volume mouvements par mois.
Notifications
| Événement | Canal | Destinataire |
|---|---|---|
| OT créé (curatif) | In-app | Responsable SAV |
| OT assigné | In-app + email | Technicien |
| OT proche SLA | In-app + email | Responsable SAV |
| OT en retard SLA | In-app + email + SMS | Responsable SAV + direction |
| OT complété | In-app + email + PDF | Client demandeur |
| Asset perdu | In-app | Manager logistique |
| Stock pièces bas | In-app + email | Responsable logistique |
| QR code visité | In-app (low priority) | Commercial du compte |
| Maintenance préventive due | In-app | Responsable SAV |
Location
Référence technique du domaine Location — affaires, contrats, financement PMT, agréments bailleurs, cessions, assurance, maintenance, prélèvements et engagements bancaires.
Comptabilité
Référence technique du domaine Comptabilité analytique & clôture — plan comptable, affectation des charges, immobilisations, clôture annuelle, pivots.