feat(commercial) : entités + repositories M2 fournisseurs (ERP-86) #65
Reference in New Issue
Block a user
Delete Branch "feature/ERP-86-entites-repos-m2"
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?
ERP-86 — Entités + Repositories M2 Fournisseurs (étape 2/7)
PR empilée sur ERP-85 (#64) : ne contient que le commit ERP-86. À merger après #64 (la base rebascule automatiquement au fil des merges de la chaîne #63 → #64 → develop).
Dépend de #64 (migration BDD). Bloque #87 (Provider + Processor) et suivants.
Contenu
4 entités jumelles du M1
Client*, mapping ORM aligné exactement sur la migration ERP-85 (noms, types, longueurs, FK, M2M, index), sans contact inline (ERP-106) :Supplier—#[Auditable]+ Timestampable/Blamable. Formulaire principal, onglet Information (+volumeForecast, spécifique fournisseur), onglet Comptabilité (FK référentiels M1 partagés), archivage (isArchived/archivedAt), soft-delete préparé. Catégories M2M viaCategoryInterface(règle n°1, pas d'import inter-module). Pas dedistributor/broker.SupplierContact— onglet Contacts (RG-2.04 :firstNameOUlastName).SupplierAddress— enumaddressType(PROSPECT/DEPART/RENDUviaAssert\Choice),bennes,triageProvider; M2M sites/contacts/categories.SupplierRib— RIB, embed gaté comptable.Domain/Repository/+ implsInfrastructure/Doctrine/.Points clés
isArchived()/isTriageProvider()avec#[Groups]+#[SerializedName('isX')](parade piège booléen n°3) ; embedcontacts/addresses(supplier:item:read) etribs(supplier:read:accounting).getSites()agrège/dédoublonne lesSitedes adresses (name/postalCode, pas decode).hydrateListCollections()en 2 passes (categories, puisaddresses.sites) — évite le produit cartésien (pattern ERP-100). Filtres : recherchecompanyName+ contacts liés (D1),categoryCode,siteId, archivage.#[ApiResource]: Provider/Processor (gating accounting, archivage, mode strict) sont au ticket ERP-87. L'ajouter ici référencerait des classes inexistantes → boot/tests cassés. Les groupes de lecture/écriture sont déjà en place ; lenormalizationContextviendra avec #87.Assert\Length(max)calé sur les colonnes. Garde-fouEntityConstraintsHaveFrenchMessageTestétendu :Assert\Choiceajouté au mapping ;addressTypeetpostalCodewhitelistés du miroir Length (déjà bornés par Choice / Regex).audit.entity.commercial_supplier*ajoutées (garde-fouAuditableEntitiesHaveI18nLabelTest).Vérifications
make test: 483/483 OK (1965 assertions).make php-cs-fixer-allow-risky: 0 correction.doctrine:schema:validate: mapping correct (bruit d'index FK cosmétique identique au M1client).