feat(catalog) : ERP-199 — entités Product + StorageType + repositories + contrat de sérialisation #150
Reference in New Issue
Block a user
Delete Branch "feat/erp-199-entites-product-storagetype"
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-199 (1.3) — M6 Catalogue produit · Backend
Crée l'entité
Product(+#[ApiResource]) et le référentielStorageTypedans le module Catalog, avec le contrat de sérialisation posé une seule fois (read-groups par propriété affichée — RETEX M1→M5, 3 maillons spec § 4.0). Stackée sur ERP-198 (migration schéma).Contenu
#[Auditable], TimestampableBlamable, soft-delete préparé non exposé § 2.7) :code(NotBlank, Length 50, unique global RG-6.01),name(Length 255),states(json multi-select PURCHASE/SALE/OTHER, ≥1 RG-6.02),manufactured/containsMolasses(RG-6.03),categoryManyToOne (PRODUIT, RG-6.05),sites+storageTypesManyToMany (≥1 — RG-6.04/6.06).Length.maxcalé sur les colonnes ORM.catalog.products.view) + Post/Patch (...manage). Pas de Delete. Provider/Processor référencés (implémentés en ERP-200).code/label+sitesManyToMany), GetCollection + Get. Whitelisté dansEntitiesAreTimestampableBlamableTest::EXCLUDED(miroir CategoryType).existsActiveByCodePATCH-aware) et StorageType.Points d'attention
Assert\\Choice(multiple: true)plutôt queAssert\\All([Choice]): équivalent fonctionnel, mais seulChoiceest géré par le garde-fouEntityConstraintsHaveFrenchMessageTest(All ferait échouer le test).product,storage_type,storage_type_site,product_site,product_storage_type) ajoutées àColumnCommentsCatalog(sinonColumnsHaveSqlCommentTestcasse aprèsschema:update --force), et l'index partieluq_product_code_activerejoué dans la lignedbal:run-sqldu makefiletest-db-setup.statesmappétype: 'json': DBAL réintrospectejsonb→JSON→ aucun diff destructeur (CHECKchk_product_states_not_emptypréservé).audit.entity.catalog_productposée (Product est#[Auditable]).Vérifications
make test-db-setup✅ (migrate + schema:update + apply-column-comments + index partiel, sans erreur)make test✅ 873 tests, 6541 assertions (garde-fous Architecture verts)make php-cs-fixer-allow-risky✅Review back — ERP-199 (entités + repos + contrat sérialisation), read-only.
Périmètre :
Product,StorageType, repositories, contrat de sérialisation.Vérifié conforme :
declare(strict_types=1)partout ; commentaires FR.#[Auditable]surProduct+ clé i18naudit.entity.catalog_productprésente (garde-fouAuditableEntitiesHaveI18nLabelTestvert).StorageType(référentiel) non auditable, whitelisté avec justification dansEntitiesAreTimestampableBlamableTest.ProductTimestampable/Blamable.#[Assert\*]FR explicites +Length.max== longueur colonne ORM (code50,name255) — garde-fouEntityConstraintsHaveFrenchMessageTestvert.category/sites/storageTypesembarqués (objets, pas IRI nus),statestableau, booléens présents.Verdict : ✅ aucun retour obligatoire.
Review M6 « Produit » — relecture croisée (couche données + couche application) sur le diff cumulé
develop…HEAD.Verdict : 0 bloquant, 0 important.
Assert\*en FR.priority:1+#[IsGranted('catalog.products.view')], mêmes filtres que la liste — conforme.Nits relevés (non bloquants) :
product.states:DEFAULT '[]'::jsonbcontredisait leCHECK (jsonb_array_length(states) >= 1)(default mort, jamais atteignable) → corrigé (commit30e7839).ProductExportControllerTest: letearDownréutilisait la constante des category-types (TEST_CATEGORY_TYPE_PREFIX) pour purger des storage-types → constante dédiéeTEST_STORAGE_PREFIX(commit30e7839).Site(cross-module) du controller utilisé seulement dans un commentaire@var; DQLp.id != :idau lieu de<>: cosmétiques, laissés tels quels.?pagination=falserenvoyant unarray: conforme (pattern établiClientProvider/SupplierProvider, échappatoire documentée pour alimenter les selects).Consolidée dans #154 : la pile M6 a été reciblée sur
developen une seule MR pour un CI unique. Commits intégralement inclus dans #154 — fermée sans merge individuel.Pull request closed