Files
Ferme/CLAUDE.md
T

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 /api et frontend depuis frontend/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 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/weighPontBasculeReading (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