# Fonctionnement de l'application Inventory

## 1. A quoi sert cette application ?

Inventory est une application de **gestion d'inventaire industriel**. Elle permet de suivre et documenter l'ensemble du parc de machines d'une entreprise, avec tous les elements qui les composent : composants, pieces detachees et produits consommables.

L'objectif principal est d'avoir une **vue complete et structuree** de chaque machine : quels composants elle contient, quelles pieces sont montees dessus, quels produits sont utilises, qui les fabrique, combien ils coutent, et toute la documentation associee (manuels, fiches techniques, etc.).

---

## 2. Les entites principales

L'application s'articule autour de 7 entites fondamentales :

```
+-----------------------------------------------------------+
|                         SITE                              |
|  (usine, atelier, entrepot...)                            |
|  - nom, adresse, contact, telephone, ville, code postal   |
|  - couleur (pour identification visuelle)                 |
+-----------------------------------------------------------+
        |
        | contient des
        v
+-----------------------------------------------------------+
|                        MACHINE                            |
|  (machine industrielle sur un site)                       |
|  - nom (unique), reference, prix                          |
|  - rattachee a 1 site obligatoirement                     |
|  - peut avoir plusieurs fournisseurs/constructeurs        |
+-----------------------------------------------------------+
        |
        | est composee de
        v
+-------------------+  +-------------------+  +-------------------+
|    COMPOSANT      |  |      PIECE        |  |     PRODUIT       |
| (element fonct.)  |  | (piece detachee)  |  | (consommable)     |
| - nom, ref, desc  |  | - nom, ref, desc  |  | - nom, ref        |
| - prix            |  | - prix            |  | - prix fournisseur |
| - categorie       |  | - categorie       |  | - categorie        |
| - fournisseurs    |  | - fournisseurs    |  | - fournisseurs     |
+-------------------+  +-------------------+  +-------------------+
```

### Site
Un **site** represente un lieu physique : une usine, un atelier, un entrepot. Chaque site possede un nom, une adresse complete et un contact. Toutes les machines sont obligatoirement rattachees a un site.

### Machine
Une **machine** est l'entite centrale. C'est un equipement industriel installe sur un site. Chaque machine a un nom unique, une reference optionnelle et un prix. Elle contient une structure hierarchique de composants, pieces et produits.

### Composant
Un **composant** represente un element fonctionnel d'une machine (ex : un moteur, un systeme hydraulique, un automate). Un composant peut lui-meme contenir des sous-composants, des pieces et des produits, formant une structure arborescente.

### Piece
Une **piece** est une piece detachee (ex : un roulement, un joint, un filtre). Les pieces peuvent etre rattachees directement a une machine ou a un composant au sein d'une machine.

### Produit
Un **produit** est un consommable ou article fournisseur (ex : huile, lubrifiant, boulon specifique). Comme les pieces, les produits peuvent etre associes a une machine, a un composant ou a une piece.

### Constructeur (Fournisseur)
Un **constructeur** est un fabricant ou fournisseur. C'est un referentiel partage : le meme fournisseur peut etre associe a des machines, des composants, des pieces et des produits. Chaque fournisseur a un nom, un email et un telephone.

### Categorie (ModelType)
Une **categorie** (appelee ModelType dans le systeme) permet de classifier les composants, les pieces et les produits. Le systeme de categories est explique en detail dans la section suivante.

---

## 3. Le systeme de categories (ModelType)

Les categories sont un element cle de l'application. Elles servent a **classifier ET a structurer** les elements de l'inventaire.

### Trois familles de categories

Il existe trois familles de categories, une par type d'element :

| Famille     | S'applique aux | Exemples                                |
|-------------|----------------|-----------------------------------------|
| COMPONENT   | Composants     | "Moteur electrique", "Systeme hydraulique" |
| PIECE       | Pieces         | "Roulement", "Joint torique", "Filtre"    |
| PRODUCT     | Produits       | "Huile moteur", "Graisse", "Boulon M8"    |

### Le squelette (skeleton) : la structure imposee

La vraie puissance des categories de composants reside dans leur **squelette**. Quand on cree une categorie de composant, on definit un modele qui impose :

- **Quelles pieces** sont necessaires (par type de piece)
- **Quels produits** sont necessaires (par type de produit)
- **Quels sous-composants** sont necessaires (par type de composant)
- **Quels champs personnalises** doivent etre remplis

**Exemple concret :** La categorie "Moteur electrique" pourrait imposer :
- 1 piece de type "Roulement"
- 1 piece de type "Joint"
- 1 produit de type "Huile moteur"
- 1 sous-composant de type "Variateur"
- Des champs personnalises : "Puissance (kW)", "Vitesse (tr/min)", "Tension (V)"

```
Categorie "Moteur electrique" (squelette)
|
|-- Piece requise : type "Roulement"        --> l'utilisateur choisira quel roulement precis
|-- Piece requise : type "Joint"            --> l'utilisateur choisira quel joint precis
|-- Produit requis : type "Huile moteur"    --> l'utilisateur choisira quelle huile precise
|-- Sous-composant : type "Variateur"       --> l'utilisateur choisira quel variateur precis
|-- Champ personnalise : "Puissance (kW)"   --> l'utilisateur saisira la valeur
|-- Champ personnalise : "Tension (V)"      --> l'utilisateur saisira la valeur
```

Les categories de pieces peuvent elles aussi definir des produits requis et des champs personnalises. Les categories de produits peuvent definir des champs personnalises.

### Champs personnalises

Les champs personnalises permettent d'ajouter des informations specifiques selon la categorie. Chaque champ a :
- Un **nom** (ex : "Puissance")
- Un **type** (texte, nombre, date, etc.)
- Un caractere **obligatoire ou non**
- Des **options** possibles (pour les listes deroulantes)
- Une **valeur par defaut**
- Un **ordre d'affichage**

Les machines disposent aussi de champs personnalises, mais ceux-ci sont definis directement sur chaque machine (et non via une categorie).

---

## 4. Le cycle de vie d'un composant

Voici les etapes typiques de creation et utilisation d'un composant :

```
1. CREATION                 2. SELECTION CATEGORIE         3. REMPLISSAGE SQUELETTE
+-------------------+       +------------------------+     +---------------------------+
| Saisir :          |       | Choisir la categorie : |     | Le squelette apparait :   |
| - Nom             | ----> | "Moteur electrique"    | --> | - Piece "Roulement" : [?] |
| - Reference       |       |                        |     | - Piece "Joint" : [?]     |
| - Description     |       | Le systeme charge le   |     | - Produit "Huile" : [?]   |
| - Prix            |       | squelette associe      |     |                           |
| - Fournisseurs    |       +------------------------+     | Choisir dans le catalogue |
+-------------------+                                      | chaque element concret    |
                                                           +---------------------------+
                                                                       |
                         5. DOCUMENTS                  4. CHAMPS PERSONNALISES
                    +---------------------+       +-----------------------------+
                    | Joindre des fichiers | <---- | Remplir les champs definis  |
                    | - Manuels PDF        |       | par la categorie :          |
                    | - Fiches techniques  |       | - Puissance : 15 kW        |
                    | - Photos             |       | - Tension : 400 V          |
                    | - Schemas            |       | - Vitesse : 1500 tr/min    |
                    +---------------------+       +-----------------------------+
```

**Etape 1 - Creation :** L'utilisateur saisit les informations de base du composant (nom, reference, description, prix) et selectionne un ou plusieurs fournisseurs.

**Etape 2 - Selection de la categorie :** L'utilisateur choisit la categorie du composant (ex : "Moteur electrique"). Le systeme charge alors le squelette defini pour cette categorie.

**Etape 3 - Remplissage du squelette :** Des "emplacements" (slots) apparaissent pour chaque element requis par le squelette. L'utilisateur selectionne dans le catalogue existant les pieces, produits et sous-composants concrets qui correspondent a chaque emplacement.

**Etape 4 - Champs personnalises :** L'utilisateur remplit les champs personnalises definis par la categorie (puissance, tension, etc.).

**Etape 5 - Documents :** L'utilisateur peut joindre des fichiers au composant : manuels PDF, fiches techniques, photos, schemas...

Ce meme principe s'applique aux pieces (qui peuvent avoir des produits associes et des champs personnalises definis par leur categorie) et aux produits (qui peuvent avoir des champs personnalises).

---

## 5. Les roles utilisateurs

L'application utilise 4 niveaux de droits, organises en hierarchie. Chaque role herite automatiquement des droits du role inferieur :

```
+------------------------------------------------------------------+
|                          ROLE_ADMIN                              |
|  Tout faire + gerer les utilisateurs (creer, modifier, supprimer |
|  des comptes, attribuer des roles)                               |
+------------------------------------------------------------------+
        |  herite de
        v
+------------------------------------------------------------------+
|                       ROLE_GESTIONNAIRE                          |
|  Creer, modifier et supprimer les machines, composants, pieces,  |
|  produits, sites, fournisseurs, categories, documents,           |
|  commentaires. C'est le role d'edition principal.                |
+------------------------------------------------------------------+
        |  herite de
        v
+------------------------------------------------------------------+
|                         ROLE_VIEWER                              |
|  Consulter tout l'inventaire en lecture seule : naviguer dans    |
|  les machines, voir les structures, les catalogues, l'historique |
|  et les documents.                                               |
+------------------------------------------------------------------+
        |  herite de
        v
+------------------------------------------------------------------+
|                          ROLE_USER                               |
|  Role de base attribue automatiquement a tout utilisateur        |
|  connecte. Acces minimal.                                        |
+------------------------------------------------------------------+
```

En resume :
- **Admin** : fait tout, y compris gerer les comptes utilisateurs
- **Gestionnaire** : cree et modifie les donnees de l'inventaire
- **Viewer** : consulte l'inventaire sans pouvoir le modifier
- **User** : role de base, acces minimal

---

## 6. Les fonctionnalites cles

### Catalogues

L'application propose des **catalogues** pour chaque type d'element :
- **Catalogue des composants** : liste tous les composants avec recherche par nom, reference ou categorie
- **Catalogue des pieces** : liste toutes les pieces detachees
- **Catalogue des produits** : liste tous les produits fournisseurs
- **Liste des machines** : toutes les machines, organisees par site
- **Liste des sites** : tous les sites industriels
- **Liste des fournisseurs** : tous les constructeurs/fournisseurs

Chaque catalogue offre des fonctions de **recherche**, de **tri** et de **pagination**.

### Recherche

La recherche est disponible dans tous les catalogues et permet de filtrer par :
- Nom (recherche partielle, insensible a la casse)
- Reference (recherche partielle)
- Categorie (filtre exact ou par nom)

### Historique et audit

Chaque modification dans l'application est **tracee automatiquement**. Le systeme enregistre :
- **Qui** a fait la modification (quel utilisateur)
- **Quand** la modification a ete faite
- **Quoi** a ete modifie (les champs avant/apres)
- **Sur quel element** (machine, composant, piece, produit...)

On peut consulter :
- L'**historique d'une entite** : toutes les modifications apportees a une machine, un composant, etc.
- Le **journal d'activite global** : toutes les modifications recentes dans l'application

### Commentaires

Les utilisateurs peuvent **commenter** n'importe quel element de l'inventaire (machines, composants, pieces, produits, categories). Les commentaires ont un systeme de **resolution** : un commentaire ouvert peut etre marque comme "resolu" par un gestionnaire. Un compteur de commentaires non resolus est disponible.

### Documents

Des fichiers peuvent etre joints a toutes les entites principales :
- **Sites** : plans, reglements
- **Machines** : manuels, fiches techniques
- **Composants** : documentations constructeur
- **Pieces** : plans de pieces, specifications
- **Produits** : fiches de donnees de securite, catalogues

Les fichiers sont uploades via l'interface et peuvent etre consultes ou telecharges a tout moment. L'application gere differents formats : PDF, images, etc.

### Clonage de machines

Quand une nouvelle machine est identique ou similaire a une existante, il est possible de **cloner une machine**. Le clonage copie :
- Les champs personnalises et leurs valeurs
- Toute la structure : les liens vers les composants, pieces et produits
- La hierarchie (quel composant contient quelles pieces, etc.)

L'utilisateur choisit un nouveau nom et un site de destination. La machine clonee peut ensuite etre modifiee independamment de l'originale.

---

## 7. La structure des machines

### Vue d'ensemble

Chaque machine possede une **structure hierarchique** qui decrit de quoi elle est composee. Cette structure est une arborescence :

```
Machine "Presse hydraulique PH-200"
|
|-- Composant "Moteur principal M1"
|   |-- Piece "Roulement SKF 6205" (quantite: 2)
|   |   |-- Produit "Graisse SKF LGMT2"
|   |-- Piece "Joint Viton DN50"
|   |-- Produit "Huile Total Azolla ZS 46"
|   |-- Sous-composant "Variateur ABB ACS580"
|       |-- Piece "Fusible 63A"
|       |-- Produit "Pate thermique"
|
|-- Composant "Groupe hydraulique GH-01"
|   |-- Piece "Filtre Parker 926169Q"
|   |-- Piece "Verin Bosch CDT3" (quantite: 4)
|   |-- Produit "Huile hydraulique HLP 46"
|
|-- Piece "Courroie Gates PowerGrip"    (piece directement sur la machine)
|-- Produit "Boulon M12x50 Inox"        (produit directement sur la machine)
```

### Les liens (links)

Les elements ne sont pas directement "dans" la machine. Ils y sont rattaches par des **liens** :

- **MachineComponentLink** : rattache un composant a une machine
- **MachinePieceLink** : rattache une piece a une machine
- **MachineProductLink** : rattache un produit a une machine

Ces liens permettent :
- De definir la **hierarchie** : un composant peut etre parent d'une piece ou d'un produit, un sous-composant peut etre enfant d'un autre composant
- De specifier une **quantite** (ex : 4 verins identiques)
- De faire des **surcharges** : modifier le nom, la reference ou le prix d'un element specifiquement dans le contexte de cette machine, sans modifier l'element du catalogue

### Hierarchie parent-enfant

```
MachineComponentLink (composant dans la machine)
    |
    |-- parentLink --> null (composant racine, directement dans la machine)
    |   ou
    |-- parentLink --> autre MachineComponentLink (sous-composant)
    |
    |-- pieceLinks --> MachinePieceLink[] (pieces de ce composant)
    |-- productLinks --> MachineProductLink[] (produits de ce composant)

MachinePieceLink (piece dans la machine)
    |
    |-- parentLink --> MachineComponentLink (piece rattachee a un composant)
    |   ou
    |-- parentLink --> null (piece directement sur la machine)
    |
    |-- productLinks --> MachineProductLink[] (produits de cette piece)
```

### Catalogue vs. Structure machine

Un point important : les **composants, pieces et produits existent dans un catalogue global**. Quand on les ajoute a une machine, on cree un lien vers l'element du catalogue. Le meme composant du catalogue peut donc etre utilise dans plusieurs machines.

Les surcharges (nom, reference, prix) permettent d'adapter les informations au contexte d'une machine specifique sans modifier la fiche catalogue.

```
CATALOGUE (reference globale)          MACHINE (utilisation specifique)
+-------------------------+            +--------------------------------+
| Composant "Moteur 15kW" |           | Lien vers "Moteur 15kW"        |
| Ref: MOT-15-01          | <-------- | Surcharge nom: "Moteur gauche" |
| Prix: 2500 EUR           |           | Surcharge prix: 2200 EUR        |
+-------------------------+            +--------------------------------+
```

---

## Schemas recapitulatifs

### Relations entre entites

```
                    +--------+
                    |  Site  |
                    +--------+
                        |
                   contient (1..N)
                        |
                  +-----------+
                  |  Machine  |------------ Fournisseurs (N..N)
                  +-----------+
                   /    |    \
                  /     |     \
    Composants   Pieces   Produits
   (via liens)  (via liens) (via liens)

  +-----------+   +--------+   +---------+
  | Composant |   | Piece  |   | Produit |
  +-----------+   +--------+   +---------+
       |              |             |
       |-- Categorie  |-- Categorie |-- Categorie
       |-- Fournisseurs -- Fournisseurs -- Fournisseurs
       |-- Documents  |-- Documents |-- Documents
       |-- Champs perso -- Champs perso -- Champs perso
       |
       |-- Sous-composants (arborescence)
       |-- Pieces (slots depuis le squelette)
       |-- Produits (slots depuis le squelette)
```

### Flux de creation typique

```
1. Creer les SITES
       |
2. Creer les CATEGORIES (avec leurs squelettes)
       |
3. Creer les FOURNISSEURS
       |
4. Creer les PRODUITS (en les categorisant)
       |
5. Creer les PIECES (en les categorisant, en leur associant des produits)
       |
6. Creer les COMPOSANTS (en choisissant une categorie,
   |  en remplissant le squelette avec des pieces/produits/sous-composants)
   |
7. Creer les MACHINES (sur un site)
       |
8. STRUCTURER les machines (ajouter composants, pieces, produits)
       |
9. DOCUMENTER (joindre des fichiers a chaque element)
```
