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)
CREATE TABLE ps_ac_country_alias (
alias VARCHAR(64) NOT NULL,
iso_code CHAR(2) NOT NULL,
PRIMARY KEY (alias)
);
-- Exemples de mappings
INSERT INTO ps_ac_country_alias VALUES
('PAYS-BAS', 'NL'),
('PAYS BAS', 'NL'),
('Hollande', 'NL'),
('NL', 'NL'),
('Pays-Bas (UE)','NL'),
('RPC', 'CN'),
('Chine', 'CN'),
('China', 'CN');
À 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 = {
0b00000000001: [r'gluten', r'blé', r'seigle', r'orge', r'avoine'], # bit 1
0b00000000010: [r'crustac'], # bit 2
0b00000000100: [r'\bœuf\b', r'\begg\b', r'ovoprod'], # bit 3
0b00000001000: [r'\bpoisson\b', r'\bfish\b'], # bit 4
# ... 14 bits total
}
def detect_allergens(raw_text: str) -> int:
mask = 0
for bit, patterns in ALLERGEN_PATTERNS.items():
if any(re.search(p, raw_text, re.IGNORECASE) for p in patterns):
mask |= bit
return mask
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.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.