[ERP-78] Refonte taxonomie Catégories : type unique CLIENT + Category.code + RG-1.03/1.29 par code #42

Merged
malio merged 7 commits from feature/ERP-78-refonte-taxonomie-categories into develop 2026-06-02 08:00:43 +00:00

7 Commits

Author SHA1 Message Date
Matthieu 8a1ebdc390 docs(commercial) : align spec-back on categoryCode filter (ERP-78)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m57s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m11s
2026-06-02 09:51:32 +02:00
Matthieu f3c6db28dc fix(catalog) : align SQL backfill slug with CategoryCodeGenerator (ERP-78)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Has been cancelled
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Has been cancelled
Le backfill de code de la migration Version20260602100000 utilisait un slug
SQL (REGEXP_REPLACE) qui ne translitterait pas les accents : « Independant »
produisait IND_PENDANT la ou le generateur applicatif (AsciiSlugger) produit
INDEPENDANT. Le code categorie, cle censee etre deterministe entre
environnements, divergeait selon le chemin (SQL migration vs PHP runtime).

- CategoryCodeSql : source unique de l'expression SQL de slug, miroir fidele
  de CategoryCodeGenerator::slugify (translate() des accents Latin-1, trim _,
  fallback CATEGORY).
- Migration : etapes 3 et 5 du backfill branchees sur ce helper.
- CategoryCodeSqlSlugTest : garde-fou verrouillant l'egalite SQL = PHP sur le
  domaine accentue, pour empecher toute future derive (cause racine du bug).
2026-06-02 09:50:59 +02:00
Matthieu 5b16fd9928 docs : amend M0/M1 specs for category taxonomy refonte (ERP-78)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Failing after 28m47s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Has been cancelled
Spec M1 § 3.3 (type unique CLIENT + Category.code), RG-1.03 (filtre par code),
RG-1.29 (interdiction par code), spec-front (selects par code) et note
d'evolution dans la spec M0.
2026-06-02 09:20:58 +02:00
Matthieu dad5e33006 feat(commercial) : enforce RG-1.29 by category code on address
ClientAddress::validateCategoryCodes interdit desormais les Category de code
DISTRIBUTEUR/COURTIER sur une adresse (denylist), toute autre categorie etant
autorisee. Fixtures clients alignees (tiers distributeur/courtier via Category
de code dedie).
2026-06-02 09:20:58 +02:00
Matthieu 596f716076 refactor(commercial) : RG-1.03 distributor/broker by category code
ClientProcessor::hasCategoryCode (ex hasCategoryType) verifie le code de la
Category (DISTRIBUTEUR/COURTIER) et non plus le type. Filtre liste/export
renomme categoryType -> categoryCode (filtre sur category.code). Tests RG-1.03
distributor + courtier ajoutes ; factory de test adaptee au type unique CLIENT.
2026-06-02 09:20:58 +02:00
Matthieu 636f2ccb8e feat(catalog) : single CLIENT category type + corrective migration
Migration corrective Version20260602100000 (namespace racine) : ajoute
Category.code, cree le type unique CLIENT, reporte Distributeur/Courtier/
Secteur/Autre en Category codees sous CLIENT, supprime les anciens types.
Fixtures alignees (type unique CLIENT, categories codees). Index partiel
uq_category_code recree dans test-db-setup.
2026-06-02 09:20:58 +02:00
Matthieu 13bb51ee9a feat(catalog) : add stable auto-generated code to Category
Nouvelle colonne Category.code (NOT NULL, unique partiel uq_category_code),
slug MAJUSCULE du nom genere par CategoryCodeGenerator et fige a la creation,
expose en lecture seule. CategoryInterface::getCode() ajoute au contrat Shared.
Retrofit COMMENT (Version20260528120000) rendu conscient des colonnes pour
tolerer l'ajout de code au catalogue.
2026-06-02 09:20:43 +02:00