# Audit du merge ICAVI Gestion

## Sources analysées

1. `Gestion_ICAVI_Bons_Sortie_CAISSE...` : socle avec bons de sortie de caisse, durcissements GED et évolutions documentaires.
2. `ICAVI_GESTION_STOCK_permissioon...` : workflow Permissions/Direction.
3. `ICAVI_GESTION_STOCK...` : socle fonctionnel stock/clients/ventes/documents/GED.
4. `icaviss3.sql` : état réel de la base fournie.

## Stratégie retenue

Le projet « Bons de sortie » est utilisé comme socle applicatif car il contenait déjà des améliorations plus avancées sur les documents et la GED. Le workflow Permissions/Direction de la variante « permissioon » est ensuite intégré avec ses modèles, contrôleur, vues et migrations.

Le dump SQL n'est pas réécrit ni écrasé : il est conservé dans `database/import/icaviss3.sql` et les écarts nécessaires sont traités par les migrations Laravel postérieures au dump.

## Fonctionnalités conservées / fusionnées

### Gestion stock / vente / documents

Conservée depuis les projets sources : clients, produits, ventes, mouvements de stock, documents commerciaux, suivi clients, chat et GED.

### Documents commerciaux

Conservation des améliorations du socle Bons de sortie : recherche produit, préremplissage, chaîne documentaire, génération BL/facture, historique, audit d'impression, protections d'édition et contrôles GED.

Les nouveaux statuts sont intégrés par type :

- FAC : `VALIDE`, `ANNULE` ;
- PRO : `EN_COURS`, `VALIDE`, `ANNULE` ;
- BL : `NON_LIVRE`, `LIVRE`, `ANNULE` ;
- DEV/BC/AVO : `ENVOYE`, `VALIDE`, `REFUSE`, `ANNULE`, `FACTURE`.

Le statut historique `BROUILLON` reste accepté pour les lignes existantes du dump afin de ne pas casser les anciennes données.

### Permissions / Direction

Ajout de :

- demandes de permission ;
- compteur de référence journalier ;
- historique des décisions ;
- attribut `users.is_directeur` ;
- approbation/refus contrôlés côté serveur ;
- impression du formulaire.

Point de sécurité important : la décision est autorisée par `is_directeur`, et non par le seul rôle `admin`.

### Bons de sortie de caisse

Ajout de :

- demandes de bons ;
- séquence de références ;
- paiements et événements d'audit ;
- signature/archivage ;
- restitution : champs de suivi présents dans le schéma ;
- protections GED liées aux archives de caisse.

Le code source est conservé tel quel sur la logique métier existante ; aucune prétention n'est faite ici à modifier le workflow fonctionnel au-delà du merge demandé.

## Corrections réalisées pendant le merge

- Suppression d'une route `users.show` qui ne correspondait à aucune méthode de `UserController`.
- Correction de la persistance du champ `is_directeur` : un non-Super Admin ne peut pas s'auto-attribuer la direction via la requête HTTP.
- Contrôle serveur des actions approve/refuse par `is_directeur`.
- Conservation des statuts legacy `BROUILLON` pour les données historiques.
- Protection des statuts métier immuables (`VALIDE`, `FACTURE`, `ANNULE`, `LIVRE`) dans les chemins d'édition/changement de statut.
- Aucun `.env` source n'est livré dans le ZIP final.
- Le dump SQL est exclu des commits Git via `.gitignore`, mais conservé sous `database/import/` pour faciliter l'installation locale.

## Validation statique effectuée

- PHP lint : **97 fichiers PHP sans erreur de syntaxe**.
- Routes Laravel : **85 routes enregistrées**.
- Références Blade `route(...)` : **aucune référence vers un nom de route inexistant**.
- Actions contrôleur des routes : **aucune méthode d'action manquante**.
- Migrations ajoutées au merge : lint PHP OK.
- Version Laravel verrouillée : **11.54.0**.

## Limites de validation de cette machine

Le conteneur d'audit n'a pas `pdo_mysql` et ne contient pas l'extension PHP `mbstring`/`DOM` complète nécessaire à certains traitements Laravel. Il n'était donc pas possible d'exécuter ici :

```bash
php artisan migrate
php artisan route:cache
php artisan view:cache
```

La commande de cache échoue dans cet environnement sur `DOMDocument`; la cause est l'environnement PHP, pas une erreur de route détectée. L'installation cible doit activer les extensions Laravel requises avant validation finale.

## Point de maintenance

Le merge reste sur Laravel 11.54.0 pour éviter d'introduire une migration majeure en même temps que la fusion fonctionnelle. Laravel 11 a atteint sa fin de correctifs de sécurité le 12 mars 2026 ; une montée vers une version Laravel supportée doit donc être planifiée séparément et testée comme un projet de migration à part entière.

## Dépendances système supplémentaires

Le module d'archivage automatique des bons de sortie de caisse génère son PDF via Chrome/Chromium headless et Symfony Process. Le binaire Chrome/Chromium doit donc être disponible sur la machine cible ou indiqué par `CASH_VOUCHER_CHROME_PATH`.

Le paramètre `CASH_VOUCHER_SIGNER_USER_ID` doit correspondre à l'`id` du compte utilisateur qui joue le rôle de signataire dans **la base cible**. Le numéro présent dans `.env.example` est un défaut hérité du projet source et ne doit pas être considéré comme universel.

## Contenu retiré du paquet de déploiement

Les fichiers d'exécution trouvés dans `storage/app/ged/...` et `storage/logs/laravel.log` provenant des projets sources ont été retirés du paquet final. Ce sont des données runtime, pas du code applicatif ; leur inclusion aurait risqué de remplacer ou mélanger des documents et journaux avec ceux de l'environnement cible.

Les dossiers `storage/` restent présents avec leurs fichiers `.gitkeep`. Sur OVH, conservez le `storage/app/ged` existant lors d'un déploiement d'une application déjà en service.
