# Phase 8 — Commandes clients

## Périmètre livré

Le module couvre la liste filtrable et paginée, la création et la modification des brouillons, la duplication, la conversion d’un devis accepté, les snapshots de prix, le workflow de statut, la réservation et la libération du stock, la préparation sans mouvement physique, l’historique, les pièces jointes sécurisées, deux impressions PDF et les exports CSV, Excel et PDF.

Les bons de livraison, factures et paiements clients restent volontairement hors périmètre. La fiche commande affiche leurs emplacements comme états vides.

## Modèle de données

- `customer_order_sequences` : séquence verrouillée par société (`FOR UPDATE`).
- `customer_orders` : en-tête, relations commerciales, états et snapshots.
- `customer_order_lines` : lignes et prix définitivement figés après validation.
- `order_status_history` : chronologie et anciennes/nouvelles valeurs JSON.
- `order_attachments` : métadonnées, empreinte SHA-256 et stockage privé.
- `stock_reservations` : réutilisée avec `source_type=customer_order`, sans mouvement de stock.

Migration : `database/migrations/202608050006_phase8_customer_orders.sql`.

## Workflow

`draft → validated → confirmed → in_preparation → ready → partially_delivered/delivered → closed → archived`

Une commande peut être annulée avant livraison. L’annulation libère les réservations actives. Une commande archivée est immuable. Le stock physique ne change jamais durant la validation ou la préparation.

## Vérifications réalisées

- analyse syntaxique de tous les fichiers PHP ;
- application réelle de la migration MariaDB ;
- contrôle des tables et des onze permissions ;
- ouverture HTTP authentifiée de la liste et du formulaire ;
- vérification du lien de navigation, des filtres, KPI et lignes dynamiques.

Les scénarios nécessitant des données demandent au minimum un client, un produit stockable, un entrepôt et un devis accepté dans la société de recette.
