# Glossaire Métier — Inventory

## Contexte

**Inventory** est une application de gestion de parc machines industriel. Elle permet aux équipes de maintenance de cataloguer leurs machines, leurs sous-ensembles (composants), les pièces de rechange et les consommables associés. Chaque machine est rattachée à un site physique (usine, atelier). L'application gère la hiérarchie complète : Machine → Composants → Pièces/Produits, avec traçabilité (audit), documentation technique et champs personnalisables.

---

## Concepts Métier

### Hiérarchie principale

| Terme | Définition | Exemples concrets |
|-------|-----------|-------------------|
| **Site** | Lieu physique (usine, atelier, entrepôt). Regroupe les machines d'un même emplacement. | Usine de Lyon, Atelier Nord |
| **Machine** | Équipement industriel installé sur un site. C'est l'unité de base du parc. Contient des composants, pièces et produits. | Presse hydraulique, Tour CNC, Ligne d'embouteillage |
| **Composant** | Sous-ensemble fonctionnel d'une machine. Peut contenir des pièces, des produits, et d'autres sous-composants (imbrication). | Moteur, Pompe, Tableau électrique, Vérin |
| **Pièce** | Pièce mécanique/physique qu'on monte ou remplace. C'est l'unité de maintenance. | Joint, Écrou, Roulement, Capteur, Courroie |
| **Produit** | Consommable qu'on utilise sans monter. S'use et se renouvelle. | Huile, Dégraissant, Graisse, Liquide de refroidissement |

### Configuration et templates

| Terme | Définition |
|-------|-----------|
| **Modèle Type** (ModelType) | Template réutilisable qui définit la composition attendue d'un composant, d'une pièce ou d'un produit. Par exemple : "Pompe centrifuge XYZ nécessite 2 joints, 1 roulement et de l'huile hydraulique". |
| **Skeleton** (squelette) | La structure "vide" définie par un modèle type : la liste des emplacements requis (pièces, produits, sous-composants) avant qu'on y mette les éléments réels. |
| **Slot** (emplacement) | Emplacement concret dans un composant ou une pièce, créé à partir du skeleton. Chaque slot est à remplir avec une pièce, un produit ou un sous-composant réel. Un slot peut rester vide (pas encore sourcé). |
| **Sync** (synchronisation) | Propagation des modifications d'un modèle type vers tous les composants existants de ce type. Par exemple : ajouter un slot "filtre" au modèle type met à jour tous les composants de ce type. Surtout utilisé en phase de saisie initiale, quand on ajuste les modèles au fur et à mesure qu'on découvre la vraie composition des machines. |
| **Catégorie de modèle** | Un modèle type est classé en 3 catégories : Composant, Pièce ou Produit. Détermine quels skeletons il peut définir. |

### Transverse

| Terme | Définition |
|-------|-----------|
| **Constructeur** | Fournisseur ou fabricant. Peut être associé à une machine, un composant, une pièce ou un produit. Permet de tracer la chaîne d'approvisionnement. |
| **Champ personnalisé** (CustomField) | Attribut dynamique défini par l'utilisateur et attaché à une machine ou à un modèle type. Les composants/pièces/produits d'un même modèle type partagent les mêmes champs personnalisés. Exemples : "N° de série", "Date de garantie", "Intervalle de maintenance". |
| **Document** | Fichier attaché à n'importe quelle entité (machine, composant, pièce, produit, site, commentaire). Typé : Documentation, Devis, Facture, Plan, Photo, Autre. |
| **Commentaire** | Annotation utilisateur sur une entité, avec un statut ouvert ou résolu. Permet de signaler un problème, poser une question ou laisser une note. Peut contenir des pièces jointes. |
| **Journal d'audit** (AuditLog) | Historique automatique et immuable de toutes les créations, modifications et suppressions. Enregistre qui a fait quoi, quand, avec le détail des changements. |

### Utilisateurs et rôles

| Rôle | Droits |
|------|--------|
| **Admin** | Accès complet : gestion des utilisateurs, configuration, toutes les opérations |
| **Gestionnaire** | Créer, modifier, supprimer des machines/composants/pièces/produits |
| **Viewer** | Consultation seule, pas de modification |
| **User** | Rôle de base (accès minimal) |

---

## Workflows Utilisateur

### 1. Créer une machine
1. Choisir le **site** où la machine est installée
2. Renseigner nom, référence, prix, fournisseur(s)
3. Ajouter des **composants** à la machine (voir workflow 2)
4. Ajouter des **pièces** et **produits** directement sur la machine si nécessaire
5. Ajouter des **champs personnalisés** et des **documents**

### 2. Ajouter un composant à une machine
1. Choisir un **modèle type** pour le composant (ex: "Pompe centrifuge XYZ")
2. Les **slots** sont pré-créés automatiquement à partir du skeleton du modèle type
3. Remplir chaque slot en sélectionnant la pièce/produit/sous-composant réel
4. Les slots peuvent rester vides et être remplis plus tard

### 3. Créer ou modifier un modèle type
1. Nommer le modèle type et choisir sa catégorie (Composant, Pièce ou Produit)
2. Définir les emplacements requis : quelles pièces, quels produits, quels sous-composants
3. Définir les champs personnalisés (métadonnées) pour les entités de ce type
4. Si des composants existent déjà avec ce modèle type → utiliser le **sync** (workflow 4)

### 4. Synchroniser un modèle type
1. Modifier les emplacements du modèle type (ajout/suppression de slots)
2. Lancer un **sync preview** : visualiser l'impact sur les composants existants
3. Confirmer → les slots sont ajoutés/supprimés sur tous les composants du type
4. Surtout utile en phase de saisie initiale quand les données sont ajustées progressivement

### 5. Cloner une machine
1. Sélectionner une machine existante
2. Lancer le clonage → copie complète (composants, pièces, produits, liens, champs personnalisés)
3. Renommer la machine clonée et l'affecter à un site

### 6. Gérer les documents
1. Sélectionner une entité (machine, composant, pièce, produit, site)
2. Uploader un fichier (PDF, image, etc.)
3. Choisir le type : Documentation, Devis, Facture, Plan, Photo, Autre
4. Les documents sont consultables et téléchargeables depuis la fiche de l'entité

---

## Relations — Vue d'ensemble

```
Site
 └── Machine
      ├── Composant (→ défini par un Modèle Type)
      │    ├── Slot Pièce → Pièce (joint, écrou…)
      │    ├── Slot Produit → Produit (huile, dégraissant…)
      │    └── Slot Sous-composant → Composant (imbrication)
      ├── Pièce (directement sur la machine)
      │    └── Slot Produit → Produit
      └── Produit (directement sur la machine)

Modèle Type (template)
 ├── Skeleton Pièce Requirement → "il faut une pièce de type X"
 ├── Skeleton Produit Requirement → "il faut un produit de type Y"
 └── Skeleton Sous-composant Requirement → "il faut un composant de type Z"

Transverse (attachable à toute entité) :
 • Constructeur (fournisseur)
 • Document (fichier)
 • Commentaire (annotation)
 • Champ personnalisé (métadonnée dynamique)
 • Journal d'audit (historique automatique)
```

---

## Correspondance Métier ↔ Code

| Terme métier | Entité code | Table PG |
|-------------|-------------|----------|
| Site | `Site` | `site` |
| Machine | `Machine` | `machine` |
| Composant | `Composant` | `composant` |
| Pièce | `Piece` | `piece` |
| Produit | `Product` | `product` |
| Modèle Type | `ModelType` | `model_type` |
| Slot pièce (composant) | `ComposantPieceSlot` | `composant_piece_slot` |
| Slot produit (composant) | `ComposantProductSlot` | `composant_product_slot` |
| Slot sous-composant | `ComposantSubcomponentSlot` | `composant_subcomponent_slot` |
| Slot produit (pièce) | `PieceProductSlot` | `piece_product_slot` |
| Skeleton pièce | `SkeletonPieceRequirement` | `skeleton_piece_requirement` |
| Skeleton produit | `SkeletonProductRequirement` | `skeleton_product_requirement` |
| Skeleton sous-composant | `SkeletonSubcomponentRequirement` | `skeleton_subcomponent_requirement` |
| Constructeur | `Constructeur` | `constructeur` |
| Champ personnalisé | `CustomField` | `custom_field` |
| Valeur champ perso | `CustomFieldValue` | `custom_field_value` |
| Document | `Document` | `document` |
| Commentaire | `Comment` | `comment` |
| Journal d'audit | `AuditLog` | `audit_log` |
| Utilisateur | `Profile` | `profile` |
| Lien machine-composant | `MachineComponentLink` | `machine_component_link` |
| Lien machine-pièce | `MachinePieceLink` | `machine_piece_link` |
| Lien machine-produit | `MachineProductLink` | `machine_product_link` |
