ff47af07d2
Entités jumelles du M1 client, mapping ORM aligné sur la migration ERP-85, sans contact inline (ERP-106) : - Supplier (#[Auditable] + Timestampable/Blamable) : formulaire principal, Information (+ volumeForecast), Comptabilité (FK référentiels M1), archivage, soft-delete préparé. Catégories M2M via CategoryInterface (règle n°1). - SupplierContact / SupplierAddress (enum addressType, bennes, triageProvider) / SupplierRib. - Repositories : interfaces Domain + impls Doctrine. DoctrineSupplierRepository porte les fetch-joins anti-N+1 de la liste (categories + addresses.sites en 2 passes, pattern ERP-100) et les filtres (search companyName + contacts, categoryCode, siteId, archivage). Contrat de sérialisation (RETEX M1, 3 maillons posés sur l'entité) : read-groups sur les propriétés, getters isArchived/isTriageProvider avec SerializedName, embed contacts/addresses (supplier:item:read) et ribs (supplier:read:accounting). L'#[ApiResource] + Provider/Processor sont au ticket suivant (ERP-87). Validation FR (ERP-107) : messages FR sur toutes les contraintes, Length(max) calé sur les colonnes. Garde-fou EntityConstraintsHaveFrenchMessageTest étendu (Assert\Choice + whitelist addressType/postalCode). Clés i18n audit des 4 entités ajoutées. make test : 483/483 OK.