feat(catalog) : categories multi-types (M:N) + bouton Filtres liste #75
Reference in New Issue
Block a user
Delete Branch "feature/categories-multi-types-filters"
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?
Contexte
Une
Categoryne pouvait appartenir qu'à un seulCategoryType(ManyToOne). Le besoin métier : plusieurs types par catégorie. Cette MR fait passer la relation en ManyToMany et ajoute le bouton « Filtres » à droite de la liste des catégories (modèle Répertoire Clients).Slice vertical complet (le passage M:N casse mécaniquement le contrat inter-module
CategoryInterface, consommé par la RG-2.10 fournisseurs).Volet A — Relation M:N
Category.categoryType(ManyToOne) →categoryTypes(ManyToMany, jonctioncategory_category_type). Au moins un type obligatoire (Assert\\Count(min:1)).uq_category_name_active, remplaceuq_category_name_type_active). Message 409 reformulé.category_type_id+ nouvel index. Validée rejouable sur base fraîche.getCategoryTypeCode()→getCategoryTypeCodes(): array.Supplier/SupplierAddress/SupplierFixturesrevalident « contient FOURNISSEUR » (RG-2.10).EXISTS(ne tronque pas la collection embarquée), eager-load anti-N+1.Volet B — Bouton « Filtres »
?name=et?typeId[]=sur la collection.Front
MalioSelectCheckbox,useCategoryFormencategoryTypeIds[], colonne « Types », clés i18n.Tests / vérifs
make test: 582 tests, 2474 assertions, 0 échec ✅make nuxt-test: 236 tests ✅make php-cs-fixer-allow-risky✅make db-reset) ✅CategoryFilterTest(name partiel + typeId[] OR + multi-type non dupliqué)Review — 👍 LGTM, mergeable en l'état
Slice vertical propre, complet et cohérent de bout en bout. Aucun bug bloquant. Les deux points d'infra sensibles sont correctement traités (table de jonction mirorée dans
ColumnCommentsCatalog+ makefile/CI réalignés suruq_category_name_active).Points solides
COMMENT ONtable + colonnes,down()best-effort honnête.EXISTScorrélée → ne tronque pas la collectioncategoryTypesembarquée et évite les doublons.addSelect('cte')+Paginator(fetchJoinCollection: true)→ pas de troncature SQL sur le fetch-join to-many (le piège classique, bien évité).getCategoryTypeCode(): ?string→getCategoryTypeCodes(): arraypropagé aux 3 consommateurs (Supplier,SupplierAddress,SupplierFixtures), RG-2.10 revalidée enin_array(..., true).CategoryFilterTestcouvre le cas critique (catégorie multi-types non dupliquée + types tous embarqués) ;CategoryUniqueTestcorrectement inversé pour l'unicité globale.categoryTypeIds[], drawer Filtres double état brouillon/appliqué, jamais persisté en URL).Unicité globale du nom assumée comme volontaire ; sur base seedée pas de collision, donc OK.