docs : enums CauseEntree/Sortie avec libellés métier (A→Achat, H→PretOuPension, ...)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-22 14:43:30 +02:00
parent 3fcc39783e
commit cd9393f62f

View File

@@ -15,7 +15,8 @@ Ajouter 2 méthodes à `BovinApiInterface` : `createEntree(CreateEntreeRequest)`
| Axe | Décision | Raison |
|---|---|---|
| API d'appel | Request DTOs dédiés (un par op) | Testable, futur-compatible avec buffering de drafts. |
| Codes métier (CauseEntree, CauseSortie, CategorieBovinIPG) | Enums backed-by-string, case names = codes IPG | Type-safe sans ambiguïté de traduction ; libellés documentés en phpdoc. |
| Codes métier (CauseEntree, CauseSortie) | Enums backed-by-string, case names = libellés métier, `.value` = code IPG | Lecture explicite côté consommateur, SOAP reçoit le code via `.value`. |
| `CategorieBovinIPG` | Enum backed-by-string, case names = codes 2-lettres IPG | 13 cases avec libellés XSD courts, pas de gain à les renommer. |
| Code atelier | `?string` free-form | Pattern `[LABEM][1-9]` = 45 combinaisons, enum serait trop lourd. |
| Réponse (choice BDNi pending / validée) | DTO plat avec `bool $pendingBdniValidation` + nullable fields | Cohérent avec les DTOs existants du bundle. |
| Validation client-side | Aucune | EDNOTIF rejette via `EdnotifException` ; valeurs arrivent déjà validées en amont. |
@@ -50,30 +51,46 @@ config/services.php enregistrer les 2 mappers + updater Bovin
## Enums
Conventions :
- **Backed-by-string** avec case name == valeur (ex : `case A = 'A'`).
- Docblock sur chaque case avec le libellé issu du XSD (à titre informatif, pas exposé en runtime).
- **Backed-by-string** : `.value` = code IPG exact (ce qui part dans le payload SOAP).
- Case names = libellés métier pour `CauseEntree`/`CauseSortie` (lisibles côté consommateur).
- Case names = codes 2-lettres pour `CategorieBovinIPG` (13 cases, libellés XSD courts, pas de gain à les renommer).
- Docblock sur chaque case pour rappeler la correspondance.
- Pas de méthode `libelle()` ni de `values()` — YAGNI, à ajouter si un besoin métier concret remonte (I18N, UI de sélection).
**Note sur les codes P/H/X** : la Table 9 IPG marque ces codes comme ambigus (entrée ET sortie selon le contexte). Côté WSDL EDNOTIF, cette ambiguïté n'existe pas : chaque op a son propre enum XSD restrictif (`CauseEntreeType` = {P, A, N}, `CauseSortieType` = {H, C, M, B, E, X}). Le sens est porté par l'op appelée, pas par le code. Le bundle n'a donc rien à faire de particulier à ce sujet.
### `Malio\EdnotifBundle\Bovin\Enum\CauseEntree`
Source : `CauseEntree.XSD` + doc IPG Table 9.
```php
enum CauseEntree: string
{
case P = 'P'; // libellé à confirmer côté métier (Prêt ?)
case A = 'A'; // libellé à confirmer côté métier (Achat ?)
case N = 'N'; // libellé à confirmer côté métier (Naissance/Nouveau ?)
case Achat = 'A'; // Entrée par achat
case Naissance = 'N'; // Entrée par naissance
case PretOuPension = 'P'; // Entrée par prêt ou pension
}
```
Note : les libellés exacts ne sont pas dans le XSD (pas de `<documentation>` sur les enumerations de `CauseEntree.XSD`). Laissés en "à confirmer côté métier" dans le docblock pour que Ferme complète ; la correctness de l'appel SOAP ne dépend que du code.
### `Malio\EdnotifBundle\Bovin\Enum\CauseSortie`
Même structure, 6 cases : `H, C, M, B, E, X`. Libellés à confirmer.
Source : `CauseSortie.XSD` + doc IPG Table 9.
```php
enum CauseSortie: string
{
case Boucherie = 'B'; // Sortie pour boucherie
case Consommation = 'C'; // Sortie pour auto-consommation
case Elevage = 'E'; // Sortie pour élevage ou vente
case Mort = 'M'; // Sortie pour mort
case PretOuPension = 'H'; // Sortie pour prêt ou pension (H sur sortie = équivalent du P sur entrée)
case Autre = 'X'; // Autre cause (réservée reprise / données historiques)
}
```
### `Malio\EdnotifBundle\Bovin\Enum\CategorieBovinIPG`
13 cases documentés depuis les `<documentation>` du XSD :
Source : `CategorieBovinIPG.XSD`. 13 cases documentés depuis les `<documentation>` du XSD :
| Case | Libellé XSD |
|---|---|
@@ -301,7 +318,7 @@ Mise à jour côté Ferme : `composer update malio/ednotif-bundle` une fois la P
$response = $this->ednotif->createEntree(new CreateEntreeRequest(
bovin: new BovinRef('FR', 'FR1234567890'),
date: new DateTimeImmutable('2026-04-22'),
cause: CauseEntree::A,
cause: CauseEntree::Achat,
provenance: new ExploitationRef('FR', '12345678'),
));