Files
Ferme/AGENTS.md
tristan 624591c096
All checks were successful
Auto Tag Develop / tag (push) Successful in 7s
feat : finalisation du tableau d'estimation des poids bovin
2026-02-26 08:41:56 +01:00

6.2 KiB
Raw Blame History

AGENTS.md

Project overview

  • Symfony 8 + API Platform 4 backend, Nuxt 3 frontend in frontend/.
  • Apache vhost serves API under /api and frontend from frontend/dist.
  • API base URL on frontend uses NUXT_PUBLIC_API_BASE (see frontend/.env).

Backend conventions

  • Use English for code identifiers/messages; keep “pont-bascule” as domain term.
  • API Platform operations are defined on Doctrine entities.
  • No custom repository classes are used (src/Repository removed); use default Doctrine repositories via EntityManagerInterface.
  • Reception entity is in src/Entity/Reception.php, with custom weigh endpoint /receptions/weigh.
  • Reception fields: date_reception, license_plate, current_step (default 0), is_valid (default false).
  • Reception also has identification_number (auto N-BR-####), merchandise_type, merchandise_detail, buildings (M2M), and pellet_buildings (via reception_pellet_building).
  • date_reception is set by the UI, stored as DateTimeImmutable, serialized as Y-m-d.
  • Weight entity (src/Entity/Weight.php) is 1N with Reception, each row stores type (gross or tare), dsd, weight, weighed_at (all nullable except type).
  • Weigh endpoint /receptions/weigh returns PontBasculeReading with dsd, weight, weighedAt (formatted Y-m-d).
  • Custom exception: App\Exception\PontBasculeException with French messages, mapped to 500 in provider.
  • Parsing of pont-bascule payload is in src/Service/PontBasculePayloadDecoder.php.
  • config/reference.php is auto-generated; keep it.
  • Bovine storage:
    • src/Entity/Bovine.php with fields nationalNumber (unique), receivedWeight, arrivalDate, and buildingCase (ManyToOne).
    • src/Entity/BuildingCase.php has bovines (OneToMany).
  • Case PDF report:
    • Endpoint: GET /building_cases/{id}/weights-report (provider: App\State\BuildingCaseWeightsReportProvider).
    • Template: templates/case_weights_report.html.twig.
    • Projection logic is done in backend from arrivalDate; daily gain is currently fixed at 1.3 kg/day for all races.

Frontend conventions

  • Nuxt SSR disabled; Tailwind used.
  • Layout in frontend/layouts/default.vue: max width 1050px, header full width.
  • Tailwind custom color palette is primary (e.g. bg-primary-500).
  • Global font stack uses Helvetica via Tailwind (font-sans) and frontend/assets/css/main.css.
  • API composable in frontend/composables/useApi.ts with get/post/put/patch/delete and default JSON/PATCH content types.
  • API errors/success toasts can be customized via toastErrorMessage/toastSuccessMessage or i18n keys toastErrorKey/toastSuccessKey. Global method fallbacks use errors.http.* keys.
  • useApi uses useNuxtApp().$i18n (not useI18n) to avoid setup-only constraint in service calls.
  • Pinia store: frontend/stores/reception.ts is the source of truth for the current reception.
  • Zod is used for form validation (e.g. frontend/components/reception/reception-form.vue); shared helpers live in frontend/utils/zod-errors.ts.
  • Weighing logic is shared via frontend/composables/useWeighing.ts.
  • Reception step UI uses store state (currentStep) in frontend/pages/reception/[[id]].vue.
  • Step 2 uses frontend/components/reception/reception-product-received.vue for merchandise selection; type codes in frontend/utils/constants.ts.
  • Active nav styles in header use NuxtLink with custom slot.
  • Reusable UI components live under frontend/components/ui/ and are auto-imported with Ui prefix (e.g. UiLoadingDots).
  • Service layer lives in frontend/services/ with typed DTOs in frontend/services/dto/.
  • Reception service uses receptions, receptions/{id}, receptions/weigh and supports success/error toast keys.
  • Reception receipt endpoint is receptions/{id}/receipt (PDF) via frontend/composables/usePdfPrinter.ts.
  • Infrastructure case page prints the case weight report PDF from frontend/pages/infrastructure/case.vue using usePdfPrinter('/building_cases/{id}/weights-report').

Environment & routing

  • Frontend dev server: npm run dev in frontend/.
  • API base for local dev: http://localhost:8080/api (set in frontend/.env via NUXT_PUBLIC_API_BASE).
  • CORS handled by Nelmio; .env includes CORS_ALLOW_ORIGIN regex for localhost.
  • Nuxt i18n locales live in frontend/i18n/locales (configured via langDir: 'locales').
  • Default locale is fr; translations in frontend/i18n/locales/fr.json.

Notes

  • Do not add a GET that creates resources; use POST + PATCH.
  • Keep endpoints in plural (API Platform convention).
  • Seed and fixtures conventions:
    • app:seed now seeds infrastructure (statut, building_layout, building_case, building_case_position) and bovines.
    • app:seed uses intermediate flushes (after buildings and after infrastructure) so find queries can resolve just-created records.
    • Bovine seed rows use a legacy case token mapping to building-case code (B{building}-C{case}) before fallback to direct id lookup.
    • Fixtures include BuildingInfrastructureFixtures + BovineFixtures (via AppFixtures dependencies).
  • New reference data added:
    • Reception types (reception_type, fields: label, code), selectable on reception form.
    • Merchandise types (merchandise_type, fields: label, code) and pellet types (pellet_type, fields: label, code).
    • Buildings (building, fields: label, code) and reception allocations (reception_building M2M, reception_pellet_building unique on reception/pellet/building).
    • Suppliers (supplier) with addresses (address, fields: label, street, postal_code, city, country_code ISO2), via supplier_address join table.
    • Trucks (truck, field: name), linked to receptions.
    • Carriers (carrier, fields: name, nullable code), Drivers (driver, fields: name, carrier_id), Vehicles (vehicle, fields: plate, carrier_id, truck_id) used for LIOT logic.
    • Reception links: reception_type_id, supplier_id, address_id, truck_id, carrier_id, driver_id, user_id.
    • Address exposes fullAddress via getter for display.
    • LIOT behavior in reception form: if carrier code = LIOT, show driver + vehicle selects and hide manual license plate input; vehicle list filters by truck type and carrier; selected vehicle sets license_plate.