[ERP-76 + ERP-68] Validations d'adresse client (RG → 422) + fixtures démo Catalog/Commercial #41

Merged
malio merged 4 commits from feature/ERP-76-68-client-address-validations-fixtures into develop 2026-06-01 22:14:24 +00:00

4 Commits

Author SHA1 Message Date
Matthieu e6188535fd fix(commercial) : billingEmail vide rejete en 422 et non en 500 (RG-1.11)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m55s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m18s
Le callback validateBillingEmailPresence testait null === billingEmail. Une
chaine vide "" (champ vide envoye par le client) passait donc les validators ;
le ClientAddressProcessor la normalisait ensuite en null APRES la validation,
puis la persistance d'une adresse is_billing=true avec billing_email=null
violait le CHECK chk_client_address_billing_email -> 500 DBAL au lieu du 422
attendu. Symetriquement, "" sur une adresse non facturable etait rejete a tort
en 422 alors qu'un champ vide equivaut a une absence d'email.

Le callback raisonne desormais sur la presence effective (null OU chaine vide
apres trim = absent), coheremment avec la normalisation du processor. Deux cas
de test ajoutes : adresse facturable + "" -> 422, adresse non facturable +
"" -> 201.
2026-06-02 00:10:52 +02:00
Matthieu 039d4c6391 chore(fixtures) : make AppFixtures idempotent on --append
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m42s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m2s
admin / alice / bob sont desormais resolus via un lookup par username
(ensureUser) avant creation, sur le modele de ensureSystemRole (meme fichier)
et RbacDemoFixtures::ensureDemoUsers. Sans ce lookup, doctrine:fixtures:load
--append (sans purge) violait l'unicite de username en recreant ces comptes.

Resultat : tout le jeu de fixtures est rejouable en --append sans erreur ni
doublon (verifie : 2 runs consecutifs -> 7 users stables). Le flow canonical
make db-reset (purge + load) est inchange.
2026-06-01 23:48:45 +02:00
Matthieu 6981dec5b3 chore(fixtures) : add Catalog categories + Commercial demo clients fixtures
Donnees de demonstration dev (no-op en environnement test) couvrant les cas
metier du repertoire clients M1 :

- CategoryFixtures (Catalog) : 12 categories sur les 4 types DISTRIBUTEUR /
  COURTIER / SECTEUR / AUTRE. Depend de CategoryTypeFixtures. Idempotent
  (lookup name + type, hors soft-deleted).
- ClientFixtures (Commercial) : 14 clients couvrant RG-1.03 (dependant
  distributeur/courtier), RG-1.13 (LCR + 2 RIB), Cheque sans RIB,
  RG-1.06/07/08/11 (multi-adresses prospect/livraison/facturation), prospect
  seul, RG-1.05/1.02 (3 contacts + tel secondaire), RG-1.22 (archive), onglet
  Information complet, multi-categories M2M. Depend de CategoryFixtures /
  SitesFixtures / CommercialReferentialFixtures. Idempotent (lookup companyName
  normalise).

Resolution inter-modules via les seuls contrats Shared (CategoryInterface,
SiteProviderInterface) — regle n°1 respectee. Valeurs fournies brutes et
normalisees par ClientFieldNormalizer (companyName UPPERCASE, etc.). Donnees
conformes aux CHECK BDD et aux validators ERP-76. Garde-fou test : les deux
fixtures no-op en env test pour ne pas polluer comptages et cleanups FK.
2026-06-01 23:43:54 +02:00
Matthieu fa20482393 feat(commercial) : enforce address validations RG-1.06/07/08/11/29 → 422
Mirror applicatif des CHECK Postgres d'adresse via Assert\Callback sur
ClientAddress, joue avant la base pour remonter une 422 Hydra au lieu d'une
500 DBAL, et durcit RG-1.29 (categorie d'adresse limitee a SECTEUR/AUTRE) :

- validateProspectExclusivity : isProspect exclusif de isDelivery/isBilling
  (RG-1.06/07/08, mirror chk_client_address_prospect_exclusive).
- validateBillingEmailPresence : billingEmail obligatoire ssi isBilling
  (RG-1.11, mirror chk_client_address_billing_email).
- validateCategoryTypes : refuse une categorie DISTRIBUTEUR/COURTIER sur une
  adresse (RG-1.29, violation 'categories'), via CategoryInterface.

Les CHECK BDD restent en filet de securite. Tests ClientAddressTest durcis de
>= 400 vers 422 explicite + 4 cas RG-1.29. Cahier de test M1 mis a jour.
2026-06-01 23:21:00 +02:00