Le canonicalizer pays : transformer 49 valeurs en 12 codes ISO
Le problème de Palimex v2 : 49 valeurs distinctes pour « pays d'origine », issues de saisies libres sur 10 ans. La solution n'est pas de corriger à la main — c'est de construire une table de mapping exhaustive et d'appliquer une règle de canonicalisation à l'import.
-- Table de mapping (peuplée une fois, réutilisée à chaque import)\nCREATE TABLE ps_ac_country_alias (\n alias VARCHAR(64) NOT NULL,\n iso_code CHAR(2) NOT NULL,\n PRIMARY KEY (alias)\n);\n\n-- Exemples de mappings\nINSERT INTO ps_ac_country_alias VALUES\n ('PAYS-BAS', 'NL'),\n ('PAYS BAS', 'NL'),\n ('Hollande', 'NL'),\n ('NL', 'NL'),\n ('Pays-Bas (UE)','NL'),\n ('RPC', 'CN'),\n ('Chine', 'CN'),\n ('China', 'CN');\nÀ l'import fournisseur, votre script Python récupère la valeur brute, la normalise en minuscules, cherche l'alias, et insère le code ISO dans ps_ac_product_spec.country_origin. Si aucun alias ne correspond, le produit est mis en file d'attente de validation manuelle — jamais silencieusement ignoré.
Le détecteur regex des 14 allergènes INCO
La réglementation UE 1169/2011 impose de déclarer les 14 allergènes majeurs. Vos fournisseurs vous envoient des champs libres : « contient gluten de blé, traces de lait et d'œufs ».
Le détecteur applique un jeu de regex par allergène :
ALLERGEN_PATTERNS = {\n 0b00000000001: [r'gluten', r'blé', r'seigle', r'orge', r'avoine'], # bit 1\n 0b00000000010: [r'crustac'], # bit 2\n 0b00000000100: [r'\\bœuf\\b', r'\\begg\\b', r'ovoprod'], # bit 3\n 0b00000001000: [r'\\bpoisson\\b', r'\\bfish\\b'], # bit 4\n # ... 14 bits total\n}\n\ndef detect_allergens(raw_text: str) -> int:\n mask = 0\n for bit, patterns in ALLERGEN_PATTERNS.items():\n if any(re.search(p, raw_text, re.IGNORECASE) for p in patterns):\n mask |= bit\n return mask\nLe résultat est un entier stocké dans allergens_mask. Votre endpoint Nuxt le décode à la volée pour afficher les pictogrammes réglementaires.
Migration en production : ordre impératif
La doctrine AC impose un ordre strict pour toute migration touchant un module existant :
- 1. Bump version du module
ac_productspec(ex.1.0.0 → 1.1.0) - 2. Créer
upgrade/upgrade-1.1.0.phpavec l'ALTER TABLEidempotent (IF NOT EXISTS) - 3. Mettre à jour
sql/install.sqlpour les nouvelles installations - 4. Lancer
sync-modules-tenant.sh— PS détecte le bump et applique le delta automatiquement - 5. Exécuter le script de migration des données (canonicalizer + détecteur allergènes)
- 6. Vérifier le coverage :
SELECT COUNT(*) FROM ps_ac_product_spec WHERE country_origin IS NULL
Sur Palimex v2, ce pipeline a produit 98 % de coverage en un seul passage. Les 2 % restants (22 produits) ont été traités manuellement en moins d'une heure — avec un écran de validation dédié, pas un tableur.