🥬 Module 52
5

Leçon 5 — Canonicalizer pays, détecteur allergènes et migration en production

Leçon 5 / 5 — 2h

« L'excellence n'est pas un acte, mais une habitude. »

A

Aristote

Le Logicien · 384-322 av. J.-C.

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\n

Le 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.php avec l'ALTER TABLE idempotent (IF NOT EXISTS)
  • 3. Mettre à jour sql/install.sql pour 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.

A retenir : Commencez votre <a href="/dictionnaire/migration" title="Définition : Migration" class="dict-link">migration</a> MDM par le canonicalizer pays : c'est le chantier le plus visible, le plus rapide à valider, et celui qui débloque immédiatement les filtres front-office.

Questions & Réponses

Une question sur cette leçon ? L'IA répond automatiquement.

Vos questions et les réponses IA sont publiques et enrichissent le cours pour tous. Votre email est utilisé uniquement pour l'authentification (base légale : intérêt légitime, durée : 3 ans). Politique de confidentialité.