# Phase 5 — Stock et entrepôts

## Installation

Importer après les migrations précédentes :

`database/migrations/202608050003_phase5_stock.sql`

La migration crée huit tables et les permissions Stock/Entrepôts. Elle ne crée aucun mouvement fictif.

## Modèle et invariants

- `warehouses` : entrepôts actifs, inactifs ou archivés ;
- `stock_movements` : journal physique append-only, source unique du stock ;
- `stock_settings` : stock négatif et méthode de valorisation ;
- `product_stock_policies` : minimum/maximum par produit et entrepôt ;
- `stock_reservations` : réservations futures ;
- `inventories` et `inventory_lines` : comptages et écarts immuables ;
- `stock_alerts` : minimum, rupture, négatif et produit inactif.

Le physique est la somme des `quantity_delta`. Le réservé vient des réservations actives. Le disponible est `physique - réservé`. Les commandes fournisseur/client restent à zéro jusqu’aux phases correspondantes.

Une entrée, sortie, correction, casse, perte, retour, inventaire ou transfert crée toujours un mouvement. Aucun écran ni route ne supprime ou ne modifie un mouvement.

## Permissions

`stock.view`, `stock.create`, `stock.update`, `stock.inventory`, `stock.transfer`, `stock.export`, `stock.history`, `warehouse.view`, `warehouse.create`, `warehouse.update`, `warehouse.archive`.

## Recette exécutée

Sur MariaDB 10.4 temporaire :

1. migrations phases 2 à 5 importées ;
2. produit stockable et deux entrepôts créés ;
3. entrée de 100 au coût 10 ;
4. sortie de 20 ;
5. transfert atomique de 30, donnant 50 en source et 30 en destination ;
6. inventaire destination compté à 28, créant un ajustement de -2 ;
7. sortie excessive refusée sans ajouter de mouvement ;
8. sortie de 28 créant une rupture ;
9. stock négatif activé puis sortie de 2, solde -2 et alerte négative ;
10. CSRF invalide : HTTP 419 ;
11. inventaire validé et non modifiable ;
12. lint PHP 8.2 et couverture CSRF de toutes les routes POST.

## Rapports

Le dashboard et les exports CSV/Excel/PDF couvrent stock actuel, disponible, réservé, minimum, ruptures, négatifs et valorisation. L’historique filtre produit, entrepôt et type. Les données peuvent être agrégées par entrepôt ou catégorie sans table de solde persistante.

## Limites et extensions proposées

- Le CMP mobile est la méthode opérationnelle. FIFO/LIFO sont configurables dans le schéma, mais exigent des couches de coûts avant un usage comptable en production.
- Les quantités de commandes fournisseur/client seront calculées après développement de ces modules.
- Les réservations sont structurées mais seront créées par les futures commandes clients.
- Les emplacements internes, lots, numéros de série et dates d’expiration pourront constituer une phase avancée.
- L’export Excel reste un `.xls` compatible et le PDF est une édition sobre.
