feat(catalog) : ERP-201 — référentiel StorageType exposé (filtre site) + seed Figma + catégories PRODUIT #152
Reference in New Issue
Block a user
Delete Branch "feat/erp-201-storage-type-expose-seed"
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?
Stack sur ERP-200 (base =
feat/erp-200-product-provider-processor).ERP-201 (1.5) — Référentiel StorageType + seeds (M6)
Endpoint
GET /api/storage_types(lecture seule)label ASC, filtre?siteId[]=(sous-requête EXISTS corrélée, RG-6.06 — types dispo sur ≥ 1 site passé), pagination Hydra + échappatoire?pagination=false(référentiel borné, alimente le multi-select).createListQueryBuilder(array $siteIds)ajouté au repository (interface + impl Doctrine).GetCollection+Get(sécuritécatalog.products.view).Seeds (fixtures idempotentes par lookup
code)BOISSEAU,BOISSEAU_DOSAGE,CASE,CELLULE,CONTAINER,CUVE_MELASSE,STOCKAGE_BIG_BAG,STOCKAGE_PALETTE,TAS,ZONE— PROVISOIRE (HP-M6-02), rattachés aux 3 sites (86/17/82) via le contrat SharedSiteProviderInterface(pas d'import inter-module). Tourne dans tous les envs (référentiel).PRODUIT(réaligne dev/test sur le seed de la migration ERP-198).Fix dette ERP-198/199 (bloquant)
product.statesmappé en jsonb (options: ['jsonb' => true]) pour coller à la colonne JSONB de la migration. Sans ça,schema:updatetentaitALTER states TYPE JSON→ cassait le CHECKjsonb_array_length→ make db-reset / test-db-setup en échec.Vérifications
make db-reset✅ — fixtures chargées, données vérifiées en SQL (10 types × 3 sites, 4 catégories PRODUIT).make test✅ 873 tests (le seul échec transitoireUploadedDocumentApiTest= permissionsvar/après recréation des containers, corrigé viachown, sans rapport).make php-cs-fixer-allow-risky✅?siteId[]=couvert fonctionnellement en ERP-203.Review back — ERP-201 (référentiel StorageType exposé + seed), read-only.
Périmètre :
GET /api/storage_types+ filtre?siteId[], seed Figma, catégories PRODUIT.Vérifié conforme :
StorageTypeProviderpaginé (Paginator ORM) +?pagination=false(échappatoire select d'un référentiel borné) — pas d'array brut.?siteId[]en EXISTS corrélé : ne tronque pas la collectionsitesembarquée du produit.is_granted('catalog.products.view')sur le référentiel (servant le formulaire produit).CategoryTypePRODUIT + catégories produit, select filtré?typeCode=PRODUIT(RG-6.05).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