# CLAUDE.md

Contexte pour Claude Code sur ce dépôt. À lire avant toute intervention.

## Projet
**caisse-resto** — **caisse de restaurant** (point de vente). Dérivée du template
**baseapp** : elle hérite du socle (auth, rôles/permissions, gestion des utilisateurs,
configuration, audit).

**Entités métier à construire** (n'existent pas encore) : catégories, plats, commandes /
tickets, paiements. Voir « Ajouter une entité métier ».

## ⚠️ Piège PHP (IMPORTANT)
Le `php` du PATH Windows est en **8.1** (trop vieux pour Laravel 11). Il faut **PHP 8.2** :
- Backend : utiliser **`backend\artisan.bat <cmd>`** (wrapper qui sélectionne PHP 8.2),
  ou le chemin direct `D:\wamp64\bin\php\php8.2.0\php.exe`.
- Composer/tests : les lancer avec PHP 8.2 (ex. `composer` fonctionne si PHP 8.2 est en tête du PATH).

## Démarrer
- **`dev.bat`** (racine) lance le backend (`:8000`) + le frontend (`:5173`, hot-reload).
  **WAMP (MySQL) doit tourner.** Base de données : `caisse_resto`.
- Comptes de démo : `admin@baseapp.test` / `password` (admin) · `user@baseapp.test` / `password` (user).
- Les autres projets dérivés partagent les ports `:8000`/`:5173` → **un seul lancé à la fois**.

## Stack
- **Backend** : Laravel 11, PHP 8.2, Sanctum (auth par token), spatie/laravel-permission
  (rôles), spatie/laravel-activitylog (audit), Pest (tests), Pint (format), Telescope (dev).
- **Frontend** : React 19, Vite, TypeScript, TailwindCSS v4, TanStack Query,
  react-hook-form + zod, axios, react-router-dom.
- **DB** : MySQL (WAMP en local).

## Structure
- `backend/` — API Laravel. Routes dans `routes/api.php` (préfixe `/api`).
- `frontend/src/` — `pages/`, `components/`, `components/ui/` (kit), `hooks/`, `lib/`, `auth/`.

## Conventions backend
- **Validation** → Form Requests (`app/Http/Requests`).
- **Sorties** → API Resources (`app/Http/Resources`) ; listes **paginées**.
- **Accès admin** → middleware `admin` (basé sur `hasRole('admin')`).
- **Erreurs API** → JSON uniforme (401/404 gérés dans `bootstrap/app.php`).
- **Modèles** → soft deletes + journal d'activité (cf. `User`).

## Conventions frontend
- **Données** → hooks TanStack Query (`src/hooks/useX.ts`). Pas de `fetch` manuel dans les pages.
- **Formulaires** → react-hook-form + zod (schéma de validation).
- **UI** → composants réutilisables `src/components/ui` (Button, Input, Select, Modal, Spinner).
- **Notifications** → `toast()` de `src/lib/toast.ts`.
- **API** → instance axios `src/lib/api.ts` (ajoute le token Bearer automatiquement).

## Ajouter une entité métier (ex. `Plat`, `Commande`)
1. `backend\artisan.bat make:model Plat -m` (modèle + migration).
2. Éditer la migration (colonnes), puis `backend\artisan.bat migrate`.
3. Créer `PlatResource`, `StorePlatRequest`, `PlatController` (CRUD paginé).
4. Ajouter les routes dans `routes/api.php` (sous `auth:sanctum`, + `admin` si réservé).
5. Front : hook `usePlats` (TanStack Query) → page + formulaire (rhf/zod) + kit UI.
6. Écrire un test Pest (`backend/tests/Feature`).

## Qualité
- Tests : `backend\artisan.bat test` (Pest, SQLite en mémoire — ne touche pas MySQL).
- Format PHP : `composer pint` (avec PHP 8.2). Vérif : `composer pint:test`.
- Front : `npm run lint` et `npm run build` (dans `frontend/`).

## Base de données
- Modifier le schéma **uniquement via des migrations** (jamais à la main dans phpMyAdmin).
- phpMyAdmin : http://localhost/phpmyadmin (`root`, sans mot de passe).

## Ne jamais committer
`.env`, `vendor/`, `node_modules/`, `frontend/dist/`, `storage/*`.

## Déploiement
Voir `DEPLOY.md` (Infomaniak mutualisé : doc root → `backend/public`, build front en
local, `migrate --force` en prod, données jamais copiées).
