Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
11491b02c5 | ||
| 024af5887e | |||
|
|
91c0125876 | ||
| b510cdcc42 |
19
.idea/dataSources.xml
generated
19
.idea/dataSources.xml
generated
@@ -1,19 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
|
||||
<data-source source="LOCAL" name="ferme" uuid="f407a514-c6b4-4b26-9555-445a85892502">
|
||||
<driver-ref>postgresql</driver-ref>
|
||||
<synchronize>true</synchronize>
|
||||
<jdbc-driver>org.postgresql.Driver</jdbc-driver>
|
||||
<jdbc-url>jdbc:postgresql://localhost:5432/ferme</jdbc-url>
|
||||
<working-dir>$ProjectFileDir$</working-dir>
|
||||
</data-source>
|
||||
<data-source source="LOCAL" name="Ferme recette" uuid="ae622167-c834-4e7b-87a5-c1721036f5dc">
|
||||
<driver-ref>postgresql</driver-ref>
|
||||
<synchronize>true</synchronize>
|
||||
<jdbc-driver>org.postgresql.Driver</jdbc-driver>
|
||||
<jdbc-url>jdbc:postgresql://localhost:5432/postgres</jdbc-url>
|
||||
<working-dir>$ProjectFileDir$</working-dir>
|
||||
</data-source>
|
||||
</component>
|
||||
</project>
|
||||
2
.idea/db-forest-config.xml
generated
2
.idea/db-forest-config.xml
generated
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="db-tree-configuration">
|
||||
<option name="data" value="---------------------------------------- 1:0:f407a514-c6b4-4b26-9555-445a85892502 2:0:ae622167-c834-4e7b-87a5-c1721036f5dc " />
|
||||
<option name="data" value="---------------------------------------- 1:0:f407a514-c6b4-4b26-9555-445a85892502 2:0:ae622167-c834-4e7b-87a5-c1721036f5dc 3:0:9cad43df-2147-4989-b7a4-443067034884 4:0:09e221b8-067a-488b-9c1d-4e155a333079 " />
|
||||
</component>
|
||||
</project>
|
||||
98
.idea/workspace.xml
generated
98
.idea/workspace.xml
generated
@@ -4,10 +4,13 @@
|
||||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="7c107abe-5995-4428-8429-b146aaca8386" name="Changes" comment="feat : front page admin bovin et changelog">
|
||||
<list default="true" id="7c107abe-5995-4428-8429-b146aaca8386" name="Changes" comment="fix : on ne bloque plus le poids max d'une pesée">
|
||||
<change beforePath="$PROJECT_DIR$/.idea/dataSources.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/db-forest-config.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/db-forest-config.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/AGENTS.md" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/config/reference.php" beforeDir="false" afterPath="$PROJECT_DIR$/config/reference.php" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/frontend/pages/admin/supplier/supplier-list.vue" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/pages/admin/supplier/supplier-list.vue" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/Command/SeedCommand.php" beforeDir="false" afterPath="$PROJECT_DIR$/src/Command/SeedCommand.php" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
@@ -39,7 +42,7 @@
|
||||
<component name="Git.Settings">
|
||||
<option name="RECENT_BRANCH_BY_REPOSITORY">
|
||||
<map>
|
||||
<entry key="$PROJECT_DIR$" value="feat/356-front-page-admin-bovin" />
|
||||
<entry key="$PROJECT_DIR$" value="feat/327-voir-modifier-une-expedition-terminee" />
|
||||
</map>
|
||||
</option>
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||
@@ -223,36 +226,36 @@
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
<component name="PropertiesComponent"><![CDATA[{
|
||||
"keyToString": {
|
||||
"RunOnceActivity.MCP Project settings loaded": "true",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
|
||||
"RunOnceActivity.git.unshallow": "true",
|
||||
"RunOnceActivity.typescript.service.memoryLimit.init": "true",
|
||||
"git-widget-placeholder": "feat/352-modification-front-admin-fournisseur",
|
||||
"last_opened_file_path": "/home/sroy/Documents/test/Ferme/frontend/components/commun",
|
||||
"node.js.detected.package.eslint": "true",
|
||||
"node.js.detected.package.tslint": "true",
|
||||
"node.js.selected.package.eslint": "(autodetect)",
|
||||
"node.js.selected.package.tslint": "(autodetect)",
|
||||
"nodejs_package_manager_path": "npm",
|
||||
"settings.editor.selected.configurable": "preferences.pluginManager",
|
||||
"ts.external.directory.path": "/opt/phpstorm/plugins/javascript-plugin/jsLanguageServicesImpl/external",
|
||||
"vue.rearranger.settings.migration": "true"
|
||||
<component name="PropertiesComponent">{
|
||||
"keyToString": {
|
||||
"RunOnceActivity.MCP Project settings loaded": "true",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
|
||||
"RunOnceActivity.git.unshallow": "true",
|
||||
"RunOnceActivity.typescript.service.memoryLimit.init": "true",
|
||||
"git-widget-placeholder": "develop",
|
||||
"last_opened_file_path": "/home/sroy/Documents/test/Ferme/frontend/components/commun",
|
||||
"node.js.detected.package.eslint": "true",
|
||||
"node.js.detected.package.tslint": "true",
|
||||
"node.js.selected.package.eslint": "(autodetect)",
|
||||
"node.js.selected.package.tslint": "(autodetect)",
|
||||
"nodejs_package_manager_path": "npm",
|
||||
"settings.editor.selected.configurable": "advanced.settings",
|
||||
"ts.external.directory.path": "/opt/phpstorm/plugins/javascript-plugin/jsLanguageServicesImpl/external",
|
||||
"vue.rearranger.settings.migration": "true"
|
||||
},
|
||||
"keyToStringList": {
|
||||
"DatabaseDriversLRU": [
|
||||
"postgresql"
|
||||
"keyToStringList": {
|
||||
"DatabaseDriversLRU": [
|
||||
"postgresql"
|
||||
],
|
||||
"com.intellij.ide.scratch.ScratchImplUtil$2/New Scratch File": [
|
||||
"TEXT"
|
||||
"com.intellij.ide.scratch.ScratchImplUtil$2/New Scratch File": [
|
||||
"TEXT"
|
||||
],
|
||||
"vue.recent.templates": [
|
||||
"Vue Composition API Component"
|
||||
"vue.recent.templates": [
|
||||
"Vue Composition API Component"
|
||||
]
|
||||
}
|
||||
}]]></component>
|
||||
}</component>
|
||||
<component name="RecentsManager">
|
||||
<key name="CopyFile.RECENT_KEYS">
|
||||
<recent name="$PROJECT_DIR$/frontend/components/commun" />
|
||||
@@ -272,10 +275,11 @@
|
||||
<component name="SharedIndexes">
|
||||
<attachedChunks>
|
||||
<set>
|
||||
<option value="bundled-php-predefined-a98d8de5180a-0e0d91225499-com.jetbrains.php.sharedIndexes-PS-253.30387.85" />
|
||||
<option value="bundled-php-predefined-a98d8de5180a-0e0d91225499-com.jetbrains.php.sharedIndexes-PS-253.31033.138" />
|
||||
</set>
|
||||
</attachedChunks>
|
||||
</component>
|
||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||
<component name="TaskManager">
|
||||
<task active="true" id="Default" summary="Default task">
|
||||
<changelist id="7c107abe-5995-4428-8429-b146aaca8386" name="Changes" comment="" />
|
||||
@@ -310,14 +314,16 @@
|
||||
<workItem from="1770879701502" duration="25805000" />
|
||||
<workItem from="1770966186589" duration="914000" />
|
||||
<workItem from="1770967274060" duration="2388000" />
|
||||
</task>
|
||||
<task id="LOCAL-00020" summary="ci : fix release artefact">
|
||||
<option name="closed" value="true" />
|
||||
<created>1769024603812</created>
|
||||
<option name="number" value="00020" />
|
||||
<option name="presentableId" value="LOCAL-00020" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1769024603812</updated>
|
||||
<workItem from="1772466451823" duration="598000" />
|
||||
<workItem from="1772626984813" duration="969000" />
|
||||
<workItem from="1772786360430" duration="21000" />
|
||||
<workItem from="1772786475316" duration="3016000" />
|
||||
<workItem from="1773049125640" duration="406000" />
|
||||
<workItem from="1773049540928" duration="539000" />
|
||||
<workItem from="1773050154207" duration="1879000" />
|
||||
<workItem from="1773212999001" duration="652000" />
|
||||
<workItem from="1773215356754" duration="5754000" />
|
||||
<workItem from="1773756072697" duration="3129000" />
|
||||
</task>
|
||||
<task id="LOCAL-00021" summary="ci : ajout du script et de la doc déploiement">
|
||||
<option name="closed" value="true" />
|
||||
@@ -703,7 +709,15 @@
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1772182707441</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="69" />
|
||||
<task id="LOCAL-00069" summary="fix : on ne bloque plus le poids max d'une pesée">
|
||||
<option name="closed" value="true" />
|
||||
<created>1772447581744</created>
|
||||
<option name="number" value="00069" />
|
||||
<option name="presentableId" value="LOCAL-00069" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1772447581744</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="70" />
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
@@ -753,7 +767,6 @@
|
||||
</option>
|
||||
</component>
|
||||
<component name="VcsManagerConfiguration">
|
||||
<MESSAGE value="feat : ajout de la partie reception des marchandises (étape 3) et modification du bon de réception" />
|
||||
<MESSAGE value="feat : mise en place de composant UI pour les select, checkbox, date, text" />
|
||||
<MESSAGE value="feat : update CHANGELOG.md" />
|
||||
<MESSAGE value="feat : ajout de commentaire" />
|
||||
@@ -778,7 +791,8 @@
|
||||
<MESSAGE value="fix : espacement" />
|
||||
<MESSAGE value="fix : text" />
|
||||
<MESSAGE value="feat : front page admin bovin et changelog" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="feat : front page admin bovin et changelog" />
|
||||
<MESSAGE value="fix : on ne bloque plus le poids max d'une pesée" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="fix : on ne bloque plus le poids max d'une pesée" />
|
||||
</component>
|
||||
<component name="XDebuggerManager">
|
||||
<breakpoint-manager>
|
||||
@@ -793,6 +807,10 @@
|
||||
<line>6</line>
|
||||
<option name="timeStamp" value="45" />
|
||||
</line-breakpoint>
|
||||
<line-breakpoint enabled="true" type="javascript">
|
||||
<url>file://$PROJECT_DIR$/frontend/services/dto/shipment-data.ts</url>
|
||||
<option name="timeStamp" value="43" />
|
||||
</line-breakpoint>
|
||||
<line-breakpoint enabled="true" type="javascript">
|
||||
<url>file://$PROJECT_DIR$/frontend/layouts/default.vue</url>
|
||||
<line>72</line>
|
||||
|
||||
73
AGENTS.md
73
AGENTS.md
@@ -1,73 +0,0 @@
|
||||
# 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 1–N 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`.
|
||||
127
CLAUDE.md
Normal file
127
CLAUDE.md
Normal file
@@ -0,0 +1,127 @@
|
||||
# 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`
|
||||
@@ -1,2 +1,2 @@
|
||||
parameters:
|
||||
app.version: '0.0.67'
|
||||
app.version: '0.0.69'
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
v-model="localWeight.weight"
|
||||
:disabled="!isAdmin"
|
||||
:min="0"
|
||||
:max="48000"
|
||||
wrapper-class="flex-col"
|
||||
/>
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import type {Ref} from 'vue'
|
||||
import {computed, ref} from 'vue'
|
||||
import type {ReceptionData, ReceptionPayload, WeightEntryData} from '~/services/dto/reception-data'
|
||||
import type {WeightEntryData} from '~/services/dto/reception-data'
|
||||
import type {WeightData} from '~/services/dto/weight-data'
|
||||
import {getWeight} from '~/services/reception'
|
||||
import {getWeightShipment} from '~/services/shipment'
|
||||
|
||||
@@ -748,6 +748,36 @@ class SeedCommand extends Command
|
||||
],
|
||||
],
|
||||
],
|
||||
[
|
||||
'name' => 'EARL DE LA MENAUDIERE',
|
||||
'email' => 'frederic.doussineau@orange.fr',
|
||||
'phone' => '0675446004',
|
||||
'addresses' => [
|
||||
[
|
||||
'label' => 'EARL DE LA MENAUDIERE',
|
||||
'street' => '1 la menaudière',
|
||||
'street2' => null,
|
||||
'postalCode' => '86450',
|
||||
'city' => 'LEIGNE LES BOIS ',
|
||||
'countryCode' => 'FR',
|
||||
],
|
||||
],
|
||||
],
|
||||
[
|
||||
'name' => 'SARL ERBS',
|
||||
'email' => 'touillet.jacques@yahoo.fr',
|
||||
'phone' => '0675030304',
|
||||
'addresses' => [
|
||||
[
|
||||
'label' => 'SARL ERBS',
|
||||
'street' => 'les rodières ',
|
||||
'street2' => null,
|
||||
'postalCode' => '86230',
|
||||
'city' => 'Sérigny',
|
||||
'countryCode' => 'FR',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
foreach ($suppliers as $supplierData) {
|
||||
|
||||
@@ -311,6 +311,36 @@ class ReferenceFixtures extends Fixture
|
||||
],
|
||||
],
|
||||
],
|
||||
[
|
||||
'name' => 'EARL DE LA MENAUDIERE',
|
||||
'email' => 'frederic.doussineau@orange.fr',
|
||||
'phone' => '0675446004',
|
||||
'addresses' => [
|
||||
[
|
||||
'label' => 'EARL DE LA MENAUDIERE',
|
||||
'street' => '1 la menaudière',
|
||||
'street2' => null,
|
||||
'postalCode' => '86450',
|
||||
'city' => 'LEIGNE LES BOIS ',
|
||||
'countryCode' => 'FR',
|
||||
],
|
||||
],
|
||||
],
|
||||
[
|
||||
'name' => 'SARL ERBS',
|
||||
'email' => 'touillet.jacques@yahoo.fr',
|
||||
'phone' => '0675030304',
|
||||
'addresses' => [
|
||||
[
|
||||
'label' => 'SARL ERBS',
|
||||
'street' => 'les rodières ',
|
||||
'street2' => null,
|
||||
'postalCode' => '86230',
|
||||
'city' => 'Sérigny',
|
||||
'countryCode' => 'FR',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
foreach ($suppliers as $supplierData) {
|
||||
|
||||
Reference in New Issue
Block a user