# Phase 4 — Catalogue produits et services

## Installation

Après les migrations des phases 2 et 3, importer :

`database/migrations/202608050002_phase4_catalog.sql`

La migration ajoute 18 tables, les permissions, les séquences `PROD-`/`SERV-`, les unités, les taux de TVA et les niveaux de prix initiaux. Elle n’insère aucun produit fictif et ne crée aucun stock.

## Capacités livrées

- produits stockables, non stockables et services ;
- numérotation automatique et référence manuelle autorisée ;
- catégories multiniveaux avec prévention des boucles ;
- marques, unités, TVA avec taux par défaut et niveaux de prix ;
- prix HT/TTC, marge, coefficient, minimum et remise maximale ;
- tarifs multiples et tranches quantitatives non chevauchantes ;
- conditionnements, variantes uniques, kits/compositions et fournisseurs liés ;
- images/PDF privés, historique et audit global ;
- recherche, filtres, tri, pagination, duplication et archivage ;
- import CSV prévisualisé et transactionnel ; exports filtrés CSV, Excel et PDF ;
- masquage des prix d’achat et marges selon permission ;
- onglets Stock, Achats et Ventes vides sans données fictives.

## Tables

`product_sequences`, `product_categories`, `brands`, `units`, `tax_rates`, `products`, `price_levels`, `product_prices`, `quantity_prices`, `product_packagings`, `attributes`, `attribute_values`, `product_variants`, `variant_values`, `product_components`, `product_suppliers`, `product_files`, `product_history`.

## Permissions

Produits : `view`, `create`, `update`, `archive`, `export`, `import`, `view_purchase_price`, `view_margin`, `manage_prices`, `manage_variants`, `manage_packaging`, `manage_suppliers`, `manage_documents`.

Référentiels : `categories.view/create/update/disable`, `brands.view/create/update/disable`, `units.view/manage`, `tax_rates.view/manage`.

## Recette

1. Créer successivement un produit stockable, non stockable et un service ; vérifier `PROD-000001`, `PROD-000002`, `SERV-000001`.
2. Essayer une référence et un code-barres existants, puis des prix négatifs.
3. Modifier les prix et contrôler TTC, marge et coefficient.
4. Créer catégorie, sous-catégorie, marque, unité et TVA par défaut.
5. Ajouter un conditionnement, une variante, un composant et un fournisseur principal.
6. Créer des tranches contiguës puis tenter un chevauchement.
7. Téléverser image/PDF, puis tenter un type interdit et un fichier trop grand.
8. Télécharger le modèle CSV, prévisualiser, corriger et confirmer l’import.
9. Exporter avec filtres sous les trois formats.
10. Tester un rôle lecture seule, un rôle sans coûts/marges, un accès direct interdit et un CSRF invalide.

## Tests exécutés

- trois migrations importées sur MariaDB 10.4 temporaire ;
- création réelle des trois types et séquences correctes ;
- modification d’un prix, carton de 12, variante et composant : réussies ;
- catégorie/sous-catégorie et marque : réussies ;
- export CSV : réussi ; CSRF invalide : HTTP 419 ;
- lint de tous les fichiers PHP sous PHP 8.2 : réussi.

## Limites

- Les combinaisons de variantes sont générées à partir d’une clé normalisée saisie ; un générateur cartésien visuel pourra compléter l’ergonomie.
- Excel est fourni en `.xls` compatible Excel, pas en `.xlsx` OpenXML.
- Le PDF catalogue est volontairement simple et limité à une page.
- Les fichiers image sont conservés en galerie privée ; la génération de miniatures n’est pas encore incluse.
- Aucun mouvement, quantité ou valorisation de stock n’existe dans cette phase.
