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).
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.
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).
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.
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.