fix(commercial) : corrige le contrat de sérialisation du répertoire clients (ERP-80/81/82/83) #45

Merged
malio merged 2 commits from fix/M1-serialization into develop 2026-06-02 09:51:37 +00:00
Owner

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

  • ERP-80 — Fuite RIB (sécurité) : Client::getRibs() et les propriétés de ClientRib passent sous le groupe gaté client:read:accounting (ajouté au contexte par ClientReadGroupContextBuilder uniquement si accounting.view). La clé ribs est désormais absente du détail pour la Commerciale. La sous-ressource autonome /api/client_ribs/{id} conserve client_rib:read (écriture/PATCH intacts).
  • ERP-81 — Booléens d'adresse : #[Groups] + #[SerializedName] portés sur les getters isProspect()/isDelivery()/isBilling() (le getter booléen strippait le préfixe is et droppait la clé — même pattern que Client::isArchived).
  • ERP-82 — Embed Category/Site : category:read + site:read ajoutés au normalizationContext du Get Client → categories[].code/.name et addresses[].sites[].name embarqués.
  • ERP-83 — Tests anti-régression : nouveau ClientSerializationContractTest (7 tests, 64 assertions) assertant sur le corps JSON réel.

Dépendance signalée

⚠️ L'entité Site n'a pas de champ code (ni SiteInterface) — son libellé est name. 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 un Site.code est requis (notamment pour getSiteCodes() au M2).

Vérifications

  • make test : 460 tests, 1535 assertions, exit 0
  • make php-cs-fixer-allow-risky : 0 fix
  • Capture JSON réelle AVANT/APRÈS (client 6 TRANSPORTS RAPIDES) :
    • Admin : ribs présents, siren/accountNumber/nTva présents, categories[].code/.name + addresses[].sites[].name embarqués, booléens d'adresse présents.
    • Commerciale : ribs absent, scalaires comptables absents (omission), embed Category/Site + booléens visibles.

Tickets : ERP-80, ERP-81, ERP-82, ERP-83 (passés « En review »).

## 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 - **ERP-80 — Fuite RIB (sécurité)** : `Client::getRibs()` et les propriétés de `ClientRib` passent sous le groupe gaté `client:read:accounting` (ajouté au contexte par `ClientReadGroupContextBuilder` uniquement si `accounting.view`). La clé `ribs` est désormais **absente** du détail pour la Commerciale. La sous-ressource autonome `/api/client_ribs/{id}` conserve `client_rib:read` (écriture/PATCH intacts). - **ERP-81 — Booléens d'adresse** : `#[Groups]` + `#[SerializedName]` portés sur les **getters** `isProspect()/isDelivery()/isBilling()` (le getter booléen strippait le préfixe `is` et droppait la clé — même pattern que `Client::isArchived`). - **ERP-82 — Embed Category/Site** : `category:read` + `site:read` ajoutés au `normalizationContext` du `Get` Client → `categories[].code/.name` et `addresses[].sites[].name` embarqués. - **ERP-83 — Tests anti-régression** : nouveau `ClientSerializationContractTest` (7 tests, 64 assertions) assertant sur le **corps JSON réel**. ## Dépendance signalée ⚠️ L'entité **`Site` n'a pas de champ `code`** (ni `SiteInterface`) — son libellé est `name`. 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 un `Site.code` est requis (notamment pour `getSiteCodes()` au M2). ## Vérifications - `make test` : **460 tests, 1535 assertions, exit 0** ✅ - `make php-cs-fixer-allow-risky` : 0 fix ✅ - Capture JSON réelle AVANT/APRÈS (client 6 TRANSPORTS RAPIDES) : - **Admin** : `ribs` présents, `siren`/`accountNumber`/`nTva` présents, `categories[].code/.name` + `addresses[].sites[].name` embarqués, booléens d'adresse présents. - **Commerciale** : `ribs` **absent**, scalaires comptables **absents** (omission), embed Category/Site + booléens visibles. Tickets : ERP-80, ERP-81, ERP-82, ERP-83 (passés « En review »).
matthieu added 1 commit 2026-06-02 09:47:33 +00:00
fix(commercial) : corrige le contrat de serialisation du repertoire clients
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Has been cancelled
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Has been cancelled
eb8094b314
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).
malio added 1 commit 2026-06-02 09:47:55 +00:00
Merge branch 'develop' into fix/M1-serialization
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m45s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m5s
aaee41be72
matthieu added the backM1-Clienttype/fix labels 2026-06-02 09:47:57 +00:00
malio merged commit 1ff335b3fe into develop 2026-06-02 09:51:36 +00:00
malio deleted branch fix/M1-serialization 2026-06-02 09:51:37 +00:00
Sign in to join this conversation.