bc14e3893b
Entité Product (#[Auditable], TimestampableBlamable, soft-delete préparé non exposé) et référentiel StorageType (lecture seule, provisoire) dans le module Catalog, avec le contrat de sérialisation posé une fois (read-groups par propriété affichée — RETEX M1→M5, 3 maillons spec § 4.0). - Product : code (unique global RG-6.01), name, states (json multi-select PURCHASE/SALE/OTHER ≥1, RG-6.02), manufactured/containsMolasses (RG-6.03), category ManyToOne (PRODUIT, RG-6.05), sites + storageTypes ManyToMany (≥1). Messages FR sur toutes les contraintes, Length calée colonnes. Opérations Get/GetCollection (.view) + Post/Patch (.manage), pas de Delete. Provider/ Processor référencés (implémentés en ERP-200). - StorageType : code/label + sites ManyToMany (filtrage par site, ERP-201). Référentiel statique → whitelist EntitiesAreTimestampableBlamableTest. - Repositories Product/StorageType (interfaces Domain + impl Doctrine). - Validation états via Assert\Choice(multiple) plutôt qu'Assert\All (seul Choice est géré par EntityConstraintsHaveFrenchMessageTest). - Garde-fous schema:update : 5 tables M6 ajoutées à ColumnCommentsCatalog, index partiel uq_product_code_active rejoué dans makefile test-db-setup. - i18n audit.entity.catalog_product.