# Relations Eloquent - Gestion des Stocks Hôpital

Ce document récapitule toutes les relations Eloquent définies entre les modèles.

---

## 📋 Modèle User

### Relations `hasMany` (Un utilisateur a plusieurs...)
- `departments()` - Départements créés
- `suppliers()` - Fournisseurs créés
- `categories()` - Catégories créées
- `products()` - Produits créés
- `stocks()` - Stocks créés
- `movementStocks()` - Mouvements de stock créés
- `requests()` - Demandes associées (user_id)
- `createdRequests()` - Demandes créées (created_by)
- `approvedRequests()` - Demandes approuvées (approved_by)
- `rejectedRequests()` - Demandes rejetées (rejected_by)
- `equipment()` - Équipements créés

**Exemple d'utilisation :**
```php
$user = User::find(1);
$user->departments; // Collection de départements
$user->products; // Collection de produits
$user->createdRequests; // Demandes créées par cet utilisateur
```

---

## 📋 Modèle Department

### Relations `belongsTo` (Un département appartient à...)
- `user()` - Utilisateur créateur

### Relations `hasMany` (Un département a plusieurs...)
- `movementStocks()` - Mouvements de stock
- `requests()` - Demandes
- `equipment()` - Équipements

**Exemple d'utilisation :**
```php
$department = Department::find(1);
$department->user; // Utilisateur créateur
$department->requests; // Toutes les demandes du département
$department->equipment; // Tous les équipements du département
```

---

## 📋 Modèle Supplier

### Relations `belongsTo` (Un fournisseur appartient à...)
- `user()` - Utilisateur créateur

### Relations `hasMany` (Un fournisseur a plusieurs...)
- `products()` - Produits fournis

**Exemple d'utilisation :**
```php
$supplier = Supplier::find(1);
$supplier->user; // Utilisateur créateur
$supplier->products; // Tous les produits de ce fournisseur
```

---

## 📋 Modèle Category

### Relations `belongsTo` (Une catégorie appartient à...)
- `user()` - Utilisateur créateur

### Relations `hasMany` (Une catégorie a plusieurs...)
- `products()` - Produits de cette catégorie

**Exemple d'utilisation :**
```php
$category = Category::find(1);
$category->user; // Utilisateur créateur
$category->products; // Tous les produits de cette catégorie
```

---

## 📋 Modèle Unit

### Relations `hasMany` (Une unité a plusieurs...)
- `products()` - Produits utilisant cette unité

**Exemple d'utilisation :**
```php
$unit = Unit::find(1);
$unit->products; // Tous les produits utilisant cette unité (kg, L, etc.)
```

---

## 📋 Modèle Product

### Relations `belongsTo` (Un produit appartient à...)
- `category()` - Catégorie
- `supplier()` - Fournisseur
- `unit()` - Unité de mesure
- `user()` - Utilisateur créateur

### Relations `hasMany` (Un produit a plusieurs...)
- `stocks()` - Stocks
- `movementStocks()` - Mouvements de stock
- `requestDetails()` - Détails de demandes
- `equipment()` - Équipements associés

**Exemple d'utilisation :**
```php
$product = Product::find(1);
$product->category; // Catégorie du produit
$product->supplier; // Fournisseur
$product->unit; // Unité de mesure (kg, L, etc.)
$product->stocks; // Tous les stocks de ce produit
$product->movementStocks; // Tous les mouvements de ce produit
```

---

## 📋 Modèle Stock

### Relations `belongsTo` (Un stock appartient à...)
- `product()` - Produit
- `user()` - Utilisateur créateur

**Exemple d'utilisation :**
```php
$stock = Stock::find(1);
$stock->product; // Produit du stock
$stock->user; // Utilisateur créateur
```

---

## 📋 Modèle MovementStock

### Relations `belongsTo` (Un mouvement appartient à...)
- `department()` - Département
- `product()` - Produit
- `user()` - Utilisateur créateur

**Exemple d'utilisation :**
```php
$movement = MovementStock::find(1);
$movement->department; // Département concerné
$movement->product; // Produit concerné
$movement->user; // Utilisateur qui a créé le mouvement

// Récupérer tous les mouvements d'un département
$department = Department::find(1);
$department->movementStocks; // Tous les mouvements du département
```

---

## 📋 Modèle Request

### Relations `belongsTo` (Une demande appartient à...)
- `department()` - Département demandeur
- `user()` - Utilisateur associé (user_id)
- `createdBy()` - Utilisateur créateur (created_by)
- `approvedBy()` - Utilisateur approbateur (approved_by)
- `rejectedBy()` - Utilisateur rejeteur (rejected_by)

### Relations `hasMany` (Une demande a plusieurs...)
- `requestDetails()` - Détails de la demande

**Exemple d'utilisation :**
```php
$request = Request::find(1);
$request->department; // Département demandeur
$request->createdBy; // Utilisateur qui a créé la demande
$request->approvedBy; // Utilisateur qui a approuvé (peut être null)
$request->rejectedBy; // Utilisateur qui a rejeté (peut être null)
$request->requestDetails; // Tous les détails de la demande

// Récupérer toutes les demandes d'un département
$department = Department::find(1);
$department->requests; // Toutes les demandes du département
```

---

## 📋 Modèle RequestDetail

### Relations `belongsTo` (Un détail appartient à...)
- `request()` - Demande
- `product()` - Produit

**Exemple d'utilisation :**
```php
$detail = RequestDetail::find(1);
$detail->request; // Demande à laquelle appartient ce détail
$detail->product; // Produit demandé

// Récupérer tous les détails d'une demande
$request = Request::find(1);
$request->requestDetails; // Tous les produits demandés
```

---

## 📋 Modèle Equipment

### Relations `belongsTo` (Un équipement appartient à...)
- `product()` - Produit associé
- `user()` - Utilisateur créateur
- `department()` - Département

**Exemple d'utilisation :**
```php
$equipment = Equipment::find(1);
$equipment->product; // Produit associé
$equipment->user; // Utilisateur créateur
$equipment->department; // Département auquel appartient l'équipement

// Récupérer tous les équipements d'un département
$department = Department::find(1);
$department->equipment; // Tous les équipements du département
```

---

## 🔄 Exemples de Requêtes avec Relations

### Charger des relations (Eager Loading)
```php
// Charger un produit avec toutes ses relations
$product = Product::with(['category', 'supplier', 'unit', 'stocks'])->find(1);

// Charger une demande avec ses détails et produits
$request = Request::with(['requestDetails.product', 'department', 'createdBy'])->find(1);

// Charger tous les mouvements d'un produit avec département
$movements = MovementStock::with(['product', 'department', 'user'])
    ->where('product_id', 1)
    ->get();
```

### Requêtes avec conditions sur relations
```php
// Produits d'une catégorie spécifique
$products = Product::whereHas('category', function($query) {
    $query->where('name', 'Alimentaire');
})->get();

// Demandes approuvées par un utilisateur
$approvedRequests = Request::whereHas('approvedBy', function($query) {
    $query->where('id', 1);
})->get();

// Mouvements de stock d'un département
$movements = MovementStock::where('department_id', 1)
    ->with('product')
    ->get();
```

### Comptage de relations
```php
// Nombre de produits par catégorie
$category = Category::withCount('products')->find(1);
echo $category->products_count;

// Nombre de demandes par département
$department = Department::withCount('requests')->find(1);
echo $department->requests_count;
```

---

## 📝 Notes Importantes

1. **Relations nullable** : Certaines relations peuvent être `null` (ex: `approvedBy`, `rejectedBy` dans `Request`)
2. **Soft Deletes** : Tous les modèles utilisent `SoftDeletes`, les relations incluent automatiquement les enregistrements supprimés
3. **Cascade Delete** : Les relations sont configurées avec `cascadeOnDelete('set null')` dans les migrations
4. **Naming Convention** : Les noms de relations suivent la convention Laravel (camelCase)

---

## ✅ Toutes les Relations sont Configurées

Tous les modèles ont maintenant leurs relations Eloquent définies et prêtes à l'emploi ! 🎉

