6.0 KiB
6.0 KiB
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
/apiet frontend depuisfrontend/dist
Commands
# 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
EntityManagerInterfaceavec les repos par défaut. config/reference.phpest 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éthodesget/post/put/patch/deleteavec content-types par défaut.- Toasts personnalisables via
toastErrorMessage/toastSuccessMessageou clés i18ntoastErrorKey/toastSuccessKey. - Utilise
useNuxtApp().$i18n(pasuseI18n) pour fonctionner hors setup.
- Toasts personnalisables via
- Validation formulaires avec Zod ; helpers dans
utils/zod-errors.ts. - Nav active :
NuxtLinkavec slotcustom. - PDFs :
usePdfPrinter(receipt réception, rapport poids cases).
Domaine métier clé
Réception (pesée pont-bascule)
- Entité principale
Reception:date_reception(DateTimeImmutable, formatY-m-d),identification_number(autoN-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]].vuebasée surcurrentStep.
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).BuildingCaseabovines(OneToMany).- Rapport PDF cases :
GET /building_cases/{id}/weights-report→ template Twig, projection depuisarrivalDate, gain journalier fixe1.3 kg/jour.
Données de référence
ReceptionType,MerchandiseType,PelletType,Building,Supplier(avecAddressvia join table),Truck,Carrier,Driver,Vehicle.AddressexposefullAddressvia 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épendancesAppFixtures).
Environnement
- API base dev :
http://localhost:8080/api(viaNUXT_PUBLIC_API_BASEdansfrontend/.env) - CORS : Nelmio, configurable via
CORS_ALLOW_ORIGINdans.env - Locale par défaut :
fr— traductions dansfrontend/i18n/locales/fr.json - Docker env :
docker/.env.docker(défaut) avec override possible viadocker/.env.docker.local