fix(commercial) : corrige le contrat de sérialisation du répertoire clients (ERP-80/81/82/83) #45
Reference in New Issue
Block a user
Delete Branch "fix/M1-serialization"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
Correctifs des 4 bugs de contrat de sérialisation du répertoire clients M1, révélés par la capture du JSON réel le 02/06/2026 (cf.
docs/specs/M2-suppliers/spec-back.md§ 4.0.ter). Tous étaient des oublis silencieux (aucune erreur levée).Changements
Client::getRibs()et les propriétés deClientRibpassent sous le groupe gatéclient:read:accounting(ajouté au contexte parClientReadGroupContextBuilderuniquement siaccounting.view). La cléribsest désormais absente du détail pour la Commerciale. La sous-ressource autonome/api/client_ribs/{id}conserveclient_rib:read(écriture/PATCH intacts).#[Groups]+#[SerializedName]portés sur les gettersisProspect()/isDelivery()/isBilling()(le getter booléen strippait le préfixeiset droppait la clé — même pattern queClient::isArchived).category:read+site:readajoutés aunormalizationContextduGetClient →categories[].code/.nameetaddresses[].sites[].nameembarqués.ClientSerializationContractTest(7 tests, 64 assertions) assertant sur le corps JSON réel.Dépendance signalée
⚠️ L'entité
Siten'a pas de champcode(niSiteInterface) — son libellé estname. Les « codes 86/17/82 » de la spec M2 sont en réalité le préfixe du code postal des sites fixtures. À planifier côté module Sites si unSite.codeest requis (notamment pourgetSiteCodes()au M2).Vérifications
make test: 460 tests, 1535 assertions, exit 0 ✅make php-cs-fixer-allow-risky: 0 fix ✅ribsprésents,siren/accountNumber/nTvaprésents,categories[].code/.name+addresses[].sites[].nameembarqués, booléens d'adresse présents.ribsabsent, scalaires comptables absents (omission), embed Category/Site + booléens visibles.Tickets : ERP-80, ERP-81, ERP-82, ERP-83 (passés « En review »).
Bugs silencieux du contrat constates sur le JSON reel M1 (cf. docs/specs/M2-suppliers/spec-back.md § 4.0.ter) : - ERP-80 : gate les RIB derriere accounting.view. getRibs() et les proprietes de ClientRib passent sous le groupe gate client:read:accounting (retire du contexte Get pour la Commerciale) -> fin de la fuite IBAN/BIC. La sous-ressource autonome /api/client_ribs/{id} conserve client_rib:read. - ERP-81 : expose les booleens d'adresse isProspect/isDelivery/isBilling. #[Groups] + #[SerializedName] portes sur le getter (et non la propriete), sinon Symfony strip le prefixe "is" et droppe la cle (meme pattern que Client::isArchived). - ERP-82 : embarque code/libelle de Category et Site dans le detail client (category:read + site:read ajoutes au normalizationContext du Get). NB : Site n'a pas de champ `code` -> dependance module Sites a planifier. - ERP-83 : tests fonctionnels anti-regression assertant sur le CORPS JSON reel (jamais sur les annotations) : gating RIB, gating par omission des scalaires comptables, presence des booleens, embed code/libelle, enveloppe AP4 (member/totalItems/view sans prefixe hydra:, archives exclus).