128 lines
6.0 KiB
Markdown
128 lines
6.0 KiB
Markdown
# CLAUDE.md
|
|
|
|
## Stack
|
|
|
|
- **Backend:** Symfony 8 + API Platform 4 (PHP 8.4)
|
|
- **Frontend:** Nuxt 4 (Vue 3, Pinia, Tailwind, Zod) in `frontend/`
|
|
- **Infra:** Docker (PHP-FPM + Nginx), Apache vhost serves API sous `/api` et frontend depuis `frontend/dist`
|
|
|
|
## Commands
|
|
|
|
```bash
|
|
# Docker
|
|
make start # Démarrer les containers
|
|
make stop # Arrêter les containers
|
|
make restart # Redémarrer les containers
|
|
make shell # Shell dans le container PHP
|
|
|
|
# Install complet
|
|
make install # composer install + migrations + build frontend
|
|
|
|
# Backend
|
|
make composer-install # Installer dépendances PHP
|
|
make migration-migrate # Lancer les migrations
|
|
make fixtures # Charger les fixtures
|
|
make cache-clear # Vider le cache Symfony
|
|
make test # Lancer les tests PHPUnit
|
|
make test FILES=tests/path/to/TestFile.php # Test spécifique
|
|
make php-cs-fixer-allow-risky FILES=src/... # Fixer le style
|
|
|
|
# Frontend
|
|
make build-nuxtJS # npm install + build:dist (dans le container)
|
|
make dev-nuxt # Serveur dev Nuxt (dans le container)
|
|
# Ou directement dans frontend/ :
|
|
cd frontend && npm run dev # Dev server (port 3000)
|
|
cd frontend && npm run build:dist # Build production
|
|
|
|
# Base de données
|
|
make db-reset # ⚠️ Supprime et recrée la BDD + migrations + fixtures
|
|
```
|
|
|
|
## Architecture backend
|
|
|
|
```
|
|
src/
|
|
├── ApiResource/ # Ressources API Platform custom
|
|
├── Command/ # Commandes Symfony (dont app:seed)
|
|
├── DataFixtures/ # Fixtures Doctrine
|
|
├── Dto/ # DTOs (ex: PontBasculeReading)
|
|
├── Entity/ # Entités Doctrine (= ressources API Platform)
|
|
├── Exception/ # Exceptions custom (PontBasculeException)
|
|
├── Kernel.php
|
|
├── Service/ # Services métier (PontBasculePayloadDecoder…)
|
|
└── State/ # State providers/processors API Platform
|
|
```
|
|
|
|
## Architecture frontend
|
|
|
|
```
|
|
frontend/
|
|
├── components/
|
|
│ ├── ui/ # Composants réutilisables, auto-importés avec préfixe Ui (ex: UiLoadingDots)
|
|
│ └── reception/ # Composants métier réception
|
|
├── composables/ # useApi, useWeighing, usePdfPrinter, useAppVersion
|
|
├── services/ # Couche service avec DTOs typés dans services/dto/
|
|
├── stores/ # Pinia stores (reception, shipment, auth)
|
|
├── pages/ # Pages Nuxt (file-based routing)
|
|
├── layouts/ # Layout default : max-width 1050px
|
|
├── i18n/locales/ # Traductions (défaut: fr)
|
|
├── utils/ # Constants, zod-errors helpers
|
|
└── assets/css/ # Tailwind config, main.css (font Helvetica)
|
|
```
|
|
|
|
## Conventions backend
|
|
|
|
- Code en anglais ; "pont-bascule" est un terme métier conservé tel quel.
|
|
- Les opérations API Platform sont définies directement sur les entités Doctrine.
|
|
- Pas de classes Repository custom : utiliser `EntityManagerInterface` avec les repos par défaut.
|
|
- `config/reference.php` est auto-généré — ne pas modifier à la main.
|
|
- Endpoints toujours au pluriel (convention API Platform).
|
|
- Ne jamais créer de GET qui crée des ressources : utiliser POST + PATCH.
|
|
|
|
## Conventions frontend
|
|
|
|
- SSR désactivé. Tailwind avec palette custom `primary` (ex: `bg-primary-500`).
|
|
- `useApi` (`composables/useApi.ts`) : méthodes `get/post/put/patch/delete` avec content-types par défaut.
|
|
- Toasts personnalisables via `toastErrorMessage`/`toastSuccessMessage` ou clés i18n `toastErrorKey`/`toastSuccessKey`.
|
|
- Utilise `useNuxtApp().$i18n` (pas `useI18n`) pour fonctionner hors setup.
|
|
- Validation formulaires avec Zod ; helpers dans `utils/zod-errors.ts`.
|
|
- Nav active : `NuxtLink` avec slot `custom`.
|
|
- PDFs : `usePdfPrinter` (receipt réception, rapport poids cases).
|
|
|
|
## Domaine métier clé
|
|
|
|
### Réception (pesée pont-bascule)
|
|
- Entité principale `Reception` : `date_reception` (DateTimeImmutable, format `Y-m-d`), `identification_number` (auto `N-BR-####`), `current_step` (défaut 0), `is_valid` (défaut false).
|
|
- `Weight` (1-N avec Reception) : `type` (`gross`/`tare`), `dsd`, `weight`, `weighed_at`.
|
|
- Endpoint pesée : `/receptions/weigh` → `PontBasculeReading` (dsd, weight, weighedAt).
|
|
- Parsing payload pont-bascule : `Service/PontBasculePayloadDecoder.php`.
|
|
- Exception : `PontBasculeException` (messages en français, mappée 500).
|
|
- Store Pinia `reception.ts` = source de vérité pour la réception en cours.
|
|
- UI multi-étapes dans `pages/reception/[[id]].vue` basée sur `currentStep`.
|
|
|
|
### LIOT (transport)
|
|
- Si carrier code = `LIOT` : afficher sélecteurs driver + vehicle, masquer saisie plaque manuelle.
|
|
- Liste véhicules filtrée par type de camion et transporteur.
|
|
- Le véhicule sélectionné alimente `license_plate`.
|
|
|
|
### Bovins & infrastructure
|
|
- `Bovine` : `nationalNumber` (unique), `receivedWeight`, `arrivalDate`, `buildingCase` (ManyToOne).
|
|
- `BuildingCase` a `bovines` (OneToMany).
|
|
- Rapport PDF cases : `GET /building_cases/{id}/weights-report` → template Twig, projection depuis `arrivalDate`, gain journalier fixe `1.3 kg/jour`.
|
|
|
|
### Données de référence
|
|
- `ReceptionType`, `MerchandiseType`, `PelletType`, `Building`, `Supplier` (avec `Address` via join table), `Truck`, `Carrier`, `Driver`, `Vehicle`.
|
|
- `Address` expose `fullAddress` via getter.
|
|
|
|
### Seed & fixtures
|
|
- Commande `app:seed` : seed infrastructure (statut, building_layout, building_case, building_case_position) puis bovins.
|
|
- Utilise des flush intermédiaires pour que les queries find fonctionnent sur les records fraîchement créés.
|
|
- Fixtures : `BuildingInfrastructureFixtures` + `BovineFixtures` (via dépendances `AppFixtures`).
|
|
|
|
## Environnement
|
|
|
|
- API base dev : `http://localhost:8080/api` (via `NUXT_PUBLIC_API_BASE` dans `frontend/.env`)
|
|
- CORS : Nelmio, configurable via `CORS_ALLOW_ORIGIN` dans `.env`
|
|
- Locale par défaut : `fr` — traductions dans `frontend/i18n/locales/fr.json`
|
|
- Docker env : `docker/.env.docker` (défaut) avec override possible via `docker/.env.docker.local`
|