feat(commercial) : catégories de type Adresse pour les blocs adresse (client + fournisseur)
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 51s
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 2m24s

Introduit un CategoryType dédié ADRESSE (module Catalog) consommé par le champ
« Catégorie » des blocs adresse, en remplacement de la réutilisation détournée des
types CLIENT/FOURNISSEUR.

- Migration de seed du type ADRESSE + 6 catégories (Siège, Contact issues,
  Facturation, Livraison, Approvisionnement, Méthaniseur) ; fixtures alignées.
- ClientAddress : validation blacklist (DISTRIBUTEUR/COURTIER) remplacée par une
  whitelist « catégories de type ADRESSE uniquement ».
- SupplierAddress : type requis FOURNISSEUR -> ADRESSE (le bloc principal
  fournisseur reste en FOURNISSEUR).
- Front : ref dédiée addressCategories (typeCode=ADRESSE) dans les composables
  référentiels client et fournisseur ; pages new/edit câblées sur les blocs adresse.
- Tests : CategoryAdresseSeedTest + adaptation des tests d'adresse client/fournisseur.
This commit is contained in:
2026-06-25 09:22:24 +02:00
parent 2e50a760c6
commit 55c136df66
22 changed files with 444 additions and 168 deletions
@@ -36,10 +36,10 @@ abstract class AbstractCommercialApiTestCase extends AbstractApiTestCase
protected const string TEST_CATEGORY_PREFIX = 'test_cli_cat_';
/**
* Codes pilotant les RG (RG-1.03 distributor/broker, RG-1.29 adresse) : ils
* doivent matcher exactement, donc createCategory() les fetch-or-create par
* code. Les autres codes sont traites comme de simples libelles generiques et
* produisent une categorie a code UNIQUE (cf. createCategory).
* Codes pilotant les RG (RG-1.03 distributor/broker) : ils doivent matcher
* exactement, donc createCategory() les fetch-or-create par code. Les autres
* codes sont traites comme de simples libelles generiques et produisent une
* categorie a code UNIQUE (cf. createCategory).
*/
private const array RG_EXACT_CODES = ['DISTRIBUTEUR', 'COURTIER'];
@@ -75,6 +75,47 @@ abstract class AbstractCommercialApiTestCase extends AbstractApiTestCase
return $type;
}
/**
* Recupere (ou cree) le type ADRESSE (categories des blocs adresse). Idempotent
* via l'unicite de category_type.code. Laisse en place au tearDown.
*/
protected function addressCategoryType(): CategoryType
{
$em = $this->getEm();
$existing = $em->getRepository(CategoryType::class)->findOneBy(['code' => 'ADRESSE']);
if (null !== $existing) {
return $existing;
}
$type = new CategoryType();
$type->setCode('ADRESSE');
$type->setLabel('Adresse');
$em->persist($type);
$em->flush();
return $type;
}
/**
* Cree une Category de test de type ADRESSE (autorisee sur un bloc adresse).
* Code UNIQUE (suffixe aleatoire) : les categories d'adresse ne pilotent aucune
* RG par code, deux appels produisent donc deux categories distinctes.
*/
protected function createAddressCategory(): Category
{
$em = $this->getEm();
$suffix = substr(bin2hex(random_bytes(4)), 0, 8);
$category = new Category();
$category->setName(self::TEST_CATEGORY_PREFIX.'adresse_'.$suffix);
$category->setCode('ADRESSE_'.strtoupper($suffix));
$category->addCategoryType($this->addressCategoryType());
$em->persist($category);
$em->flush();
return $category;
}
/**
* Cree une Category de test sous le type unique CLIENT (ERP-78).
*