diff --git a/docs/superpowers/specs/2026-04-22-phase2-create-entree-sortie-design.md b/docs/superpowers/specs/2026-04-22-phase2-create-entree-sortie-design.md index 5f5d30b..d80b542 100644 --- a/docs/superpowers/specs/2026-04-22-phase2-create-entree-sortie-design.md +++ b/docs/superpowers/specs/2026-04-22-phase2-create-entree-sortie-design.md @@ -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 `` 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 `` du XSD : +Source : `CategorieBovinIPG.XSD`. 13 cases documentés depuis les `` 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'), ));