# Réservation de produits chez les commerçants du village

Application web (PHP 8.1+, MySQL ou SQLite) pensée pour le téléphone : un client crée un compte, choisit un commerce,
réserve ses produits pour un jour et une heure de retrait ; le commerçant voit ses réservations, gère produits,
stocks par jour, jours d'ouverture et horaires. Plusieurs commerces dans la même application.

## Ce que fait le prototype

Client : inscription/connexion, liste des commerces, choix du jour, stock restant, réservation, annulation
(jusqu'à l'heure limite du commerçant), historique.
Commerçant : réservations du jour avec récapitulatif « à préparer » (prête / retirée / annulée), produits et prix,
stock par défaut et stock/disponibilité par jour, horaires (2 plages par jour), fermetures exceptionnelles,
règles de réservation (« la veille à 18h », durée à l'avance).
Administration (mairie) : création des commerces et de leur compte, masquage d'un commerce.
Sécurité : mots de passe hachés, requêtes préparées, jetons CSRF, échappement HTML, cloisonnement entre commerces,
limitation des tentatives de connexion, stock contrôlé sous verrou (pas de survente).
RGPD : page de confidentialité type (à adapter), script de purge `bin/purge.php`.

Hors périmètre de ce prototype : paiement en ligne, e-mails/SMS de confirmation, mot de passe oublié, sauvegardes
automatiques, installation sur l'écran d'accueil (PWA).

## Essai en local (SQLite)

    php bin/install.php --demo --admin-email=admin@exemple.fr --admin-password=un-mot-de-passe-solide
    PHP_CLI_SERVER_WORKERS=4 php -S 127.0.0.1:8000 -t public

Puis http://127.0.0.1:8000. Comptes de démo (mot de passe `demo1234`) : `boulanger@demo.test`, `client@demo.test`.
Ne jamais utiliser `--demo` en production.

## Mise en production (MySQL, ex. hébergement OVH)

1. Créer une base MySQL, puis `config.local.php` à la racine :

       <?php return [
         'db_dsn' => 'mysql:host=HOTE;dbname=BASE;charset=utf8mb4',
         'db_user' => 'UTILISATEUR', 'db_pass' => 'MOT_DE_PASSE',
         'commune' => 'Limeyrat', 'contact_email' => 'mairie@...',
       ];

2. Pointer le dossier racine du site sur `public/` (sur OVH : « multisite », dossier racine = `.../public`).
   Le dossier `src/`, `config*.php` et `data/` ne doivent pas être accessibles depuis le web.
3. Créer les tables et le compte admin : `php bin/install.php --admin-email=... --admin-password=...`
   (en SSH ; sans SSH, l'exécuter depuis une tâche planifiée une seule fois).
4. Activer HTTPS, puis la redirection dans `public/.htaccess`.
5. Planifier chaque nuit `php bin/purge.php` (réservations > 6 mois, comptes inactifs > 2 ans).
6. Sauvegarder la base régulièrement.

Test réalisé sur SQLite uniquement. Le chemin MySQL (verrou `SELECT … FOR UPDATE`, schéma InnoDB) est écrit mais
doit être vérifié sur votre hébergement avant ouverture.

## Organisation du code

    public/index.php        point d'entrée et routes
    src/pages/*.php         une page = un fichier (client, m_* commerçant, a_* admin)
    src/booking.php         règles de réservation, stock, contrôle atomique
    src/db.php              connexion, schéma, verrou par commerce
    src/auth.php            comptes, sessions, rôles
    bin/                    install.php, purge.php
