# Recette fonctionnelle

La recette doit être exécutée sur une base de test, jamais sur les données de production.

## Gates techniques

- Tous les fichiers PHP passent `php -l`.
- `php bin/health-check.php` retourne `[OK]`.
- MariaDB démarre sans `skip-grant-tables`.
- Les pages login, dashboard, factures, paiements, chèques, rapports et paramètres répondent 200 après authentification.
- Une route interdite répond 403, un POST sans CSRF répond 419 et une ressource inconnue répond 404.

## Parcours commercial

Créer client, produit, commande, livraison et facture. Vérifier les quantités restantes et l'interdiction de double facturation. Valider deux fois la même facture et confirmer un seul numéro comptable et une seule échéance. Contrôler le snapshot et le PDF.

Créer un acompte de 30 %, le valider, puis créer la facture de solde et vérifier la déduction. Tenter un acompte supérieur au restant. Créer et valider un avoir total sur une facture impayée; la facture d'origine doit finir avec un solde nul sans mouvement de stock.

Créer un modèle récurrent et soumettre deux fois la même occurrence; une seule occurrence et une seule facture doivent exister.

## Parcours financier

Valider un paiement espèces affecté puis l'annuler; facture et caisse doivent revenir aux valeurs antérieures via mouvements inverses. Pour un chèque, vérifier zéro mouvement bancaire à la réception, dépôt sans mouvement, puis exactement un mouvement à l'encaissement. Un rejet doit annuler les affectations.

Ouvrir et clôturer une caisse; un écart exige une justification. Effectuer deux transferts successifs et vérifier les deux côtés ainsi que le refus si le solde est insuffisant.

## Exploitation

Créer un rapport CSV/PDF, sauvegarder la base, comparer le SHA-256, décompresser le gzip et vérifier la présence des tables principales et `SET FOREIGN_KEY_CHECKS=1`. Tester le mode maintenance avec un utilisateur non administrateur.
