# Update 1 — Désignations multiples par intervention + Autocomplete

> **Date** : 2026-05-10  
> **Scope** : Fonctionnel + Base de données + UI

---

## Contexte

Avant cette mise à jour, une intervention ne pouvait contenir qu'**une seule désignation de service**, stockée directement sur la table `interventions` via les colonnes snapshot `designation_id`, `designation_name`, `designation_price`.

---

## Changements

### 1. Schéma de base de données

**Nouvelle table `intervention_designations`** (pivot, analogue à `intervention_parts`) :

```
id                bigint PK
intervention_id   bigint FK → interventions.id CASCADE DELETE
designation_id    bigint FK → designations.id RESTRICT DELETE
designation_name  varchar(200) NOT NULL  -- snapshot
designation_price decimal(10,2) NOT NULL -- snapshot
created_at        timestamp
updated_at        timestamp

INDEX (intervention_id)
```

**Colonnes supprimées de `interventions`** :
- `designation_id`
- `designation_name`
- `designation_price`

La migration `2026_05_10_000001_create_intervention_designations_table.php` effectue la transition et migre les données existantes (une désignation par intervention) vers la nouvelle table pivot.

### 2. Nouvelles relations

| Modèle | Méthode | Type |
|---|---|---|
| `Intervention` | `interventionDesignations()` | `HasMany → InterventionDesignation` |
| `Designation` | `interventionDesignations()` | `HasMany → InterventionDesignation` |
| `InterventionDesignation` | `intervention()` | `BelongsTo → Intervention` |
| `InterventionDesignation` | `designation()` | `BelongsTo → Designation` |

### 3. Nouveau modèle

`app/Models/InterventionDesignation.php` — modèle Eloquent standard avec `$fillable` et `casts()`.

### 4. DTO mis à jour

`CreateInterventionData` : propriétés `$designationId`, `$designationName`, `$designationPrice` (nullable) remplacées par :

```php
/** @param array<int, array{designation_id: int, designation_name: string, designation_price: float}> $designations */
public readonly array $designations = [],
```

### 5. Service mis à jour

`InterventionService::create()` :
- Calcul du total via `collect($data->designations)->sum(fn($d) => $d['designation_price'])`
- Création de N enregistrements `InterventionDesignation` dans la transaction DB
- Log enrichi avec `designations_count`

### 6. Interface employé — Wizard (Step 3)

- **Suppression** du `<select>` statique liste toutes les désignations
- **Ajout** d'un champ de recherche autocomplete avec debounce 300ms
- **Ajout** d'une liste des désignations sélectionnées (tableau avec bouton ✕ par ligne)
- **Ajout** d'un sous-total des désignations en temps réel
- Validation : au moins 1 désignation requise pour passer à l'étape suivante

### 7. Vues mises à jour

| Fichier | Changement |
|---|---|
| `create-intervention.blade.php` | Step 3 autocomplete + tableau multi-désignation ; Step 5 récap liste toutes les désignations |
| `show-intervention.blade.php` | Section "Désignations de service" affiche un tableau de toutes les désignations |

### 8. Panel Filament Admin

- `InterventionForm` : placeholder unique liste toutes les désignations (format `nom — prix TND`)
- `InterventionsTable` : colonne "Désignations" affiche le **nombre** de désignations liées (`withCount`)

---

## Migration

```bash
php artisan migrate
```

Aucune perte de données : les désignations existantes sont migrées automatiquement vers la nouvelle table pivot.
