# ICAVI GESTION — mise en ligne de la v2 (React + Laravel 12)

Guide pas à pas pour OVH mutualisé. La v1 (Blade) reste installée : un seul
réglage (`ICAVI_UI`) choisit l'interface servie, et le retour arrière prend
une minute (§ 7).

---

## 1. Ce qui change sur le serveur

| Élément | v1 en ligne | v2 |
|---|---|---|
| Framework | Laravel 11 | Laravel 12 + Sanctum 4 + DomPDF 3 (`vendor/` à remplacer) |
| Interface | vues Blade | React compilé dans `public/spa/`, servi par `SpaController` |
| PDF | Chrome (ne marche pas sur OVH) | DomPDF |
| Base | `icaviss3` | la même, + 7 migrations **additives** (aucune donnée supprimée) |

Nouvelles migrations :

- `2026_10_08_000001` à `000006` : colonnes IR / prix TTC, tables `categories` et `suppliers`, colonnes `category_id` / `supplier_id` ;
- `2026_10_13_000001_add_performance_indexes` : index uniquement.

---

## 2. Avant de commencer (sur ton PC)

1. Compiler l'interface :
   ```bash
   cd frontend
   npm run build        # écrit dans ../public/spa
   ```
2. Vérifier les tests : `php vendor/phpunit/phpunit/phpunit` → tout doit être OK.
3. Préparer l'archive à envoyer, **sans** : `.env`, `node_modules/`, `frontend/node_modules/`,
   `storage/logs/*`, `storage/framework/sessions/*`, `storage/framework/cache/*`, `tests/`.

---

## 3. Sauvegardes (sur OVH, avant toute copie)

```bash
cd ~/<dossier du projet>
mysqldump -h <hôte> -u <utilisateur> -p icaviss3 > ~/backup_icaviss3_$(date +%F).sql
cp -a ~/<dossier du projet> ~/backup_v1_$(date +%F)
```

Vérifier que le fichier `.sql` n'est pas vide (`ls -lh ~/backup_icaviss3_*`).

---

## 4. Copie des fichiers

1. Envoyer : `app/`, `bootstrap/app.php`, `config/`, `database/`, `public/spa/`,
   `public/index.php`, `resources/`, `routes/`, `composer.json`, `composer.lock`, `artisan`.
2. **Ne pas écraser** `.env`, `storage/app/` (fichiers GED, signature, cachet) ni `public/storage`.
3. Dépendances Laravel 12 — au choix :
   - **A (recommandé)** : en SSH sur OVH
     `php composer.phar install --no-dev --optimize-autoloader --no-interaction` ;
   - **B** : envoyer tout le dossier `vendor/` de ton PC (même version de PHP majeure que le serveur).
4. Supprimer les caches de l'ancienne version (sinon Laravel cherche des classes de la v11) :
   ```bash
   rm -f bootstrap/cache/packages.php bootstrap/cache/services.php bootstrap/cache/config.php bootstrap/cache/routes-v7.php
   ```
5. Dossiers inscriptibles : `storage/` et `bootstrap/cache/`. Créer le cache des polices PDF
   (sinon un PDF met 10 à 30 s et peut dépasser le délai) :
   ```bash
   mkdir -p storage/fonts && chmod 755 storage/fonts
   ```
6. Signature et cachet : ils doivent se trouver dans `storage/app/pdf-assets/`
   (`Signature de Mr Raymond T..png`, `Cachet ICAVI SECURE.png`) et **plus** dans `public/assets/images/`.

PHP du serveur : 8.2 minimum (Laravel 12). Vérifier avec `php -v` ; sinon changer
la version dans l'espace client OVH (fichier `.ovhconfig`).

---

## 5. Base de données et reprise des données

```bash
php artisan migrate:status          # liste ce qui va s'appliquer
php artisan migrate --force

# Catégories et fournisseurs : texte des produits → tables (aperçu, puis réel)
php artisan icavi:sync-categories --dry-run
php artisan icavi:sync-categories
php artisan icavi:sync-suppliers --dry-run
php artisan icavi:sync-suppliers

# Bons de caisse payés et signés sous la v1, sans archive PDF dans la GED
php artisan icavi:archive-cash-vouchers --dry-run
php artisan icavi:archive-cash-vouchers
```

---

## 6. Configuration et activation

1. Compléter `.env` à partir de `env.production.example` (garder l'`APP_KEY` actuelle),
   en particulier `APP_DEBUG=false`, `SESSION_SECURE_COOKIE=true` et **`ICAVI_UI=spa`**.
2. Mettre en cache :
   ```bash
   php artisan optimize
   ```
   À relancer **après chaque modification du `.env`** : les routes Blade/SPA sont choisies
   au moment de la mise en cache.
3. Tâche planifiée — espace client OVH → Hébergement → Tâches planifiées (Cron) :
   - commande : `<dossier du projet>/artisan` avec l'argument `schedule:run`
     (ou un script `cron.sh` : `cd <dossier> && php artisan schedule:run`) ;
   - langage : PHP 8.x ; fréquence : toutes les heures.

   Elle envoie les rappels de relance par e-mail (J-3 et jour J) entre 8 h et 18 h ;
   un passage manqué est rattrapé au suivant, sans doublon.

---

## 7. Retour arrière

Problème bloquant après l'activation :

```bash
# dans .env : ICAVI_UI=blade
php artisan optimize
```

L'ancienne interface revient immédiatement ; la base et les fichiers ne changent pas.
Les migrations v2 sont additives : la v1 fonctionne avec la base migrée.

Retour complet (code v1) : restaurer `~/backup_v1_<date>` ; la base n'a pas besoin d'être restaurée.

---

## 8. Recette (à cocher après activation)

Se connecter avec un compte de chaque rôle (admin, commercial, gestionnaire de stock, Direction).

- [ ] `https://gst.icavi-secure.com/up` répond, `https://gst.icavi-secure.com/api/health` répond
- [ ] Connexion / déconnexion ; une URL directe (ex. `/documents`) sans être connecté renvoie vers la connexion
- [ ] Recharger la page (F5) sur `/clients/…` : la page s'affiche (pas d'erreur 404)
- [ ] Tableau de bord : chiffres cohérents avec la v1
- [ ] Client → vente → la facture est créée → PDF de la facture
- [ ] Proforma → validation → génération facture → génération BL → PDF de chaque document
- [ ] Le PDF s'affiche en moins de 5 s, avec signature et cachet
- [ ] Demande de suppression d'un document → e-mail reçu par la Direction, lien vers la fiche → validation
- [ ] Entrée de stock → compteur et historique à jour
- [ ] Produits : catégories et fournisseurs présents (reprise § 5)
- [ ] Bon de caisse : création → paiement → confirmation de réception → PDF signé → archive dans la GED
- [ ] Permission : demande → décision de la Direction → e-mail à l'employé → PDF
- [ ] GED : import, aperçu, téléchargement, corbeille
- [ ] Utilisateurs (admin) : création, modification ; suppression refusée pour un compte avec historique
- [ ] Cloche de notifications : compteur et liens
- [ ] Tablette (768 px) et téléphone : menu et listes utilisables
- [ ] Erreur volontaire (ex. `/api/v1/documents/999999`) : message court, **aucune trace technique**
- [ ] Le lendemain : `storage/logs/laravel.log` sans erreur nouvelle ; rappel de relance reçu si une relance est prévue
