# CHANGELOG LOT 2 - Import Excel CRM SYNOLUVIA

## Objectif du lot

Mettre en place l'import reproductible du classeur Excel CRM SYNOLUVIA vers les tables CRM creees au lot 1.

Le lot 2 ajoute une commande Artisan `crm:import-excel`, un mode `--dry-run`, un service d'import dedie, un service de mise a jour des prospects apres interaction et un rapport JSON d'execution.

## Fichiers ajoutes

- `app/Console/Commands/ImportExcelCrmCommand.php`
- `app/Services/Crm/CrmImportReport.php`
- `app/Services/Crm/ExcelCrmImportService.php`
- `app/Services/Crm/ProspectInteractionService.php`
- `storage/app/imports/.gitkeep`
- `storage/app/imports/reports/.gitkeep`
- `tests/Feature/ExcelCrmImportCommandTest.php`
- `CHANGELOG_LOT_2.md`

## Fichiers modifies

- `composer.json`
  - ajout de `phpoffice/phpspreadsheet` pour lire les fichiers `.xlsx`.
- `bootstrap/app.php`
  - enregistrement du dossier `app/Console/Commands` pour les commandes Artisan dediees.
- `app/Http/Controllers/DashboardController.php`
  - prise en compte du lot 2 et affichage du dernier import journalise.
- `resources/js/Pages/Dashboard.vue`
  - affichage visuel du statut Lot 2 et du dernier import.
- `README.md`
  - ajout de la documentation d'import Excel.

## Migrations a executer

Aucune nouvelle migration dans ce lot.

Les migrations du lot 1 doivent deja avoir ete executees :

```bash
php artisan migrate
```

## Dependances a installer

Le lot 2 ajoute PhpSpreadsheet.

Depuis la VM Linux, apres extraction du ZIP :

```bash
cd ~/programme/crm
composer update phpoffice/phpspreadsheet --with-dependencies
```

Si Composer signale que le paquet n'est pas encore present dans le lock, cette commande est normale : elle installe la dependance declaree dans `composer.json`.

## Commandes Linux a lancer

Depuis le dossier du projet :

```bash
cd ~/programme/crm
unzip -o ~/Téléchargements/crm_synoluvia_lot_2.zip -d .
composer update phpoffice/phpspreadsheet --with-dependencies
php artisan optimize:clear
php artisan migrate
mkdir -p storage/app/imports
```

Copier ensuite le fichier Excel source dans :

```text
storage/app/imports/crm_synoluvia.xlsx
```

Exemple si le fichier est dans `Téléchargements` :

```bash
cp ~/Téléchargements/crm_synoluvia.xlsx storage/app/imports/crm_synoluvia.xlsx
```

Premier controle sans ecriture en base :

```bash
php artisan crm:import-excel storage/app/imports/crm_synoluvia.xlsx --dry-run
```

Import reel si le dry-run est coherent :

```bash
php artisan crm:import-excel storage/app/imports/crm_synoluvia.xlsx
```

Tests automatises :

```bash
php artisan test
```

## Equivalent PowerShell

Depuis le dossier parent contenant `crm` :

```powershell
Expand-Archive -Force .\crm_synoluvia_lot_2.zip -DestinationPath .\crm
cd .\crm
composer update phpoffice/phpspreadsheet --with-dependencies
php artisan optimize:clear
php artisan migrate
New-Item -ItemType Directory -Force .\storage\app\imports
Copy-Item .\crm_synoluvia.xlsx .\storage\app\imports\crm_synoluvia.xlsx
php artisan crm:import-excel storage/app/imports/crm_synoluvia.xlsx --dry-run
php artisan crm:import-excel storage/app/imports/crm_synoluvia.xlsx
php artisan test
```

## Tests manuels a realiser

1. Verifier que la commande existe :

```bash
php artisan list crm
```

2. Lancer le dry-run :

```bash
php artisan crm:import-excel storage/app/imports/crm_synoluvia.xlsx --dry-run
```

Controle attendu :

- `contacts_read` autour de 633 ;
- `contacts_would_create` autour de 633 si la base est vide ;
- `interactions_read` autour de 3 ;
- `errors` a 0 idealement.

3. Lancer l'import reel :

```bash
php artisan crm:import-excel storage/app/imports/crm_synoluvia.xlsx
```

4. Controler les volumes importes :

```bash
php artisan tinker --execute="dump(App\Models\Prospect::count(), App\Models\Interaction::count(), App\Models\Prospect::where('requires_contact_form', true)->count());"
```

Controle attendu avec le fichier source actuel :

- environ 633 prospects ;
- environ 3 interactions ;
- environ 52 prospects avec contact par formulaire.

5. Recharger le tableau de bord :

```text
http://127.0.0.1:8000/dashboard
```

Le tableau de bord doit afficher `Lot 2` et les compteurs de prospects/interactions apres import.

## Points de vigilance

- Le fichier Excel doit conserver les onglets `Contacts` et `Interactions`.
- Les noms de colonnes source sont attendus tels que definis dans le prompt maitre.
- Le dry-run ne modifie pas la base.
- L'import reel est encapsule dans une transaction base de donnees.
- Les imports sont rejouables : les contacts sont retrouves via `legacy_id_contact`, les interactions via `legacy_id_interaction`.
- Ne pas lancer l'import reel avant d'avoir controle le rapport dry-run.
- Le rapport JSON est genere dans `storage/app/imports/reports`.
- En production OVH, sauvegarder la base MySQL avant tout reimport massif.

## Hypotheses structurantes

- Le fichier Excel source reste au format `.xlsx`.
- La table `prospects` du lot 1 existe deja.
- Les contacts sans email exploitable et sans site web sont forces au statut `a_qualifier`.
- Les emails contenant le mot `formulaire` deviennent des contacts via formulaire, avec `requires_contact_form = true`.
- La valeur source de l'email est conservee dans `import_raw_email` lorsqu'elle n'est pas convertie en adresse email exploitable.
