Contact
Travaillons ensemble
Système d'Import Multi-Fournisseurs de Donnees Produits

Système d'Import Multi-Fournisseurs de Donnees Produits

Moteur d'import critique de la marketplace B2B European Sourcing - 254+ fournisseurs, 120+ tables en base, 8 types d'import CSV, 5 langues, 7 ans de développement (2009-2016).

2009 - 2016
~7 ans
Software Engineer puis Senior Software Engineer
PHP 5.xMySQLSymfony 2.xSmartyjQuery 1.7BootstrapDockerVagrantApacheMemcachedProxySQLPostgreSQLFTPCSVXMLSVNGitDomPDFPHPMailer

Lignes de code

131,765

Code PHP applicatif (hors tiers)

Fournisseurs

254+

254+ dossiers d'import identifiés

Tables en base

120+

120+ tables MySQL

Langues

5

FR, EN, DE, ES, IT

Présentation et définition

Un moteur d'import centralisé pour le marche européen de l'objet promotionnel

Le projet Import European Sourcing constitue le système d'importation et de gestion des données produits de la plateforme European Sourcing, un acteur majeur du secteur de l'objet publicitaire et promotionnel en Europe. European Sourcing est une place de marche B2B qui met en relation des fournisseurs d'objets publicitaires (fabricants, importateurs) avec des distributeurs/revendeurs a travers l'Europe.

Le système ingere et normalise les catalogues de 254+ fournisseurs dans des formats hétérogènes (CSV, XML, flux FTP), les traite via des pipelines de validation et de transformation, et les ecrit dans une base MySQL centralisée alimentant un moteur de recherche multilingue en 5 langues européennes.

Le système d'import a évolué en deux generations majeures :

  • Legacy (2007-2016) : Application PHP monolithique construite sur un framework MVC custom (SQLI), avec scripts batch pour l'import de catalogues et mise a jour automatique par FTP
  • Moderne (2016-2019) : Extranet Symfony (v2) introduisant des files d'attente d'import asynchrones, des schémas CSV structures pour 8 types d'import, et un suivi de progression en temps reel
Domaine métier

Objet publicitaire et promotionnel B2B - un secteur connectant les fabricants européens d'objets marques (stylos, textiles, accessoires de bureau, cadeaux d'entreprise) aux revendeurs qui les personnalisent et les commercialisent.

Périmètre fonctionnel

Import massif de catalogues fournisseurs (docs, données produits, variantes, marquages, options tarifaires, stocks), mise a jour automatique via flux FTP/XML/CSV, gestion des profils fournisseurs, génération de catalogues PDF et gestion des abonnements.

Objectifs, contexte, enjeux et risques

Comprendre les leviers business derriere le defi technique

Objectifs
  • Centraliser les catalogues de 250+ fournisseurs européens dans une base normalisee unique
  • Automatiser la mise a jour des données produits (prix, stocks, références) via flux FTP/XML/CSV
  • Fournir un extranet multilingue (5 langues : FR, EN, DE, ES, IT) pour la gestion fournisseurs et distributeurs
  • Générer des exports personnalisés en CSV et PDF pour les distributeurs et commerciaux
  • Livrer un moteur de recherche avance avec recherche phonetique, synonymes et filtrage multi-critères
Contexte

Le projet a été initialement développé par SQLI (ESN française) sur un framework PHP custom avec SQL Server, puis migré vers MySQL. L'architecture initiale (vers 2007-2010) repose sur un pattern MVC custom avec Smarty pour le templating.

Le projet est porte par Medialeads (société éditrice d'European Sourcing), dont le dépôt GitHub est `github.com/medialeads`. Entre 2016 et 2019, une version modernisee de l'extranet (v2) a été développée sur Symfony avec Bootstrap, Docker/Vagrant, et un système d'import asynchrone avec file d'attente.

L'infrastructure repose sur une architecture front/back MySQL avec load balancing : un MySQL front (192.168.0.103) pour le site public et un MySQL back (192.168.0.102) pour l'extranet d'administration, avec synchronisation par batch.

Enjeux business
  • Exhaustivite du catalogue : la valeur de la plateforme depend directement du nombre et de la qualité des produits références
  • Fraicheur des données : les prix, stocks et disponibilites changent fréquemment - la mise a jour automatique est critique
  • Qualité des données : normalisation multilingue, gestion des doublons, correspondance des références fournisseur/interne
  • Performance : avec 15 Go de dump SQL et des centaines de milliers de produits, les batchs d'import doivent etre optimises
  • Revenue : abonnements fournisseurs payants (240 EUR/an), mini-sites distributeurs, publicites
Risques identifiés

Dette technique significative

Framework PHP custom sans ORM, requêtes SQL par concatenation de chaines, fonctions dépréciées (magic_quotes, ereg)

Vulnerabilites de sécurité

Credentials en clair dans la configuration (application.xml), requêtes SQL non parametrees dans les batchs, mots de passe FTP en dur

Limites de scalabilité

Batchs d'import séquentiels avec set_time_limit de 1 a 4 heures, pas de système de queue dans la version legacy

Dépendance aux fournisseurs

Flux FTP hétérogènes - chaque fournisseur a son propre format CSV/XML, nécessitant du code spécifique de parsing par fournisseur

Les étapes - Ce que j'ai fait

Un parcours de 12 ans, de la reprise du legacy aux imports asynchrones modernes

Phase 1
Développement initial et migration
2007-2010
  • Développement de la plateforme European Sourcing par SQLI avec base SQL Server
  • Migration table par table de SQL Server vers MySQL via le module ControlAdminImport
  • Reprise de données complexe : pays, villes, services, organisations, statuts, abonnements, familles, produits, critères, synonymes, distributeurs, contacts, fournisseurs, catalogues, pages, indexations
Phase 2
Enrichissement fonctionnel
2010-2016
  • Ajout du système d'import de catalogues (scan de pages, miniatures, indexation automatique)
  • Création du système de mini-sites distributeurs (Kadobjet et 50+ domaines personnalisés)
  • Développement des exports CSV/PDF, gestion des publicites, newsletters, tableau de bord statistiques
  • Extension a 84 classes VO et 282 templates Smarty sur 5 langues
Phase 3
Automatisation des imports (FTP/XML)
2015-2018
  • Construction du système auto_mise_a_jour.php avec code spécifique par fournisseur (MID OCEAN BRANDS x10 entites, PF Concept, Pixika, Delta, Inspirion, Topico...)
  • Automatisation du téléchargement FTP, parsing XML/CSV, correspondance des références, mise a jour des prix et stocks
  • Gestion des formats hétérogènes : références multi-formats (entier/string/multi avec crochets), espaces parasites, doublons
Phase 4
Extranet v2 et import moderne
2016-2019
  • Refonte de l'extranet sur Symfony avec interface Bootstrap, environnement Docker/Vagrant
  • Conception et implémentation du système d'import asynchrone avec file d'attente (es_core_import)
  • Documentation de 8 types d'import CSV avec schémas structures (produits, variantes, marquages, tarifs, docs, profils fournisseurs)
  • Ajout du suivi de progression en temps reel, historique des imports avec horodatage et nom de l'opérateur, upload FTP des fichiers CSV
Flux de mise a jour automatique FTP/XML
Frise chronologique du projet (2007-2019)

Les acteurs et interactions

Une équipe multi-generationnelle de 20+ contributeurs sur 12 ans

20 contributeurs identifiés dans les fichiers PHP (@author), les metadonnees SVN, les logs Git, les captures d'écran et les fichiers de configuration.

Le projet a évolué en deux phases d'équipe distinctes :

  • Phase SQLI (2007-2010) : 3 développeurs principaux (jebanquey, bvermeulen, lhuangoc) ont produit 79,8% du code originel
  • Phase Medialeads (2013-2019) : Jose DA COSTA a pris le relais comme développeur principal (99,8% des commits SVN), rejoint ensuite par Thomas C., fancyweb, amandine, bastien pour la modernisation

Les acteurs non-techniques incluent les operateurs d'import (Rahnia Sadaoui, Anthony Brifouillere, Paul Meyer), les managers commerciaux, et 250+ fournisseurs externes avec flux automatisés.

Le développement suivait un modèle de livraison incrémentale (pas de méthodologie Agile identifiée), avec des livraisons thematiques organisees dans un dossier `livraisons/`.

Répartition du code originel (@author, 155 fichiers PHP)
Contributions SVN (11 868 noeuds)
Parties prenantes externes
  • Medialeads - société éditrice d'European Sourcing
  • SQLI - ESN ayant développé la plateforme initiale
  • Systonic - hébergeur (2010)
  • OVH - hébergement serveurs dédiés
  • Sogenactif (Societe Generale) - passerelle de paiement
  • 250+ fournisseurs avec flux automatisés (MID OCEAN, PF Concept, Pixika, Delta, Inspirion...)
  • 50+ distributeurs avec mini-sites personnalisés (Kadobjet, avotrimage.fr, cadonor.fr, prodiges.com...)

Les résultats

Impact pour moi et pour l'entreprise

Pour moi
  • Maîtrise de l'ingénierie d'import de données massives avec formats multi-fournisseurs hétérogènes
  • Expertise approfondie en architecture MySQL (séparation lecture/écriture, replication, denormalisation)
  • Apprentissage de la gestion d'un projet sur un cycle de vie long (12 ans), entre maintenance legacy et modernisation
  • Développement de compétences en batch processing (PHP CLI, planification cron, automatisation FTP)
  • Transition d'un codebase SQLI hérité vers la conception independante de l'architecture Symfony v2
Pour l'entreprise
  • European Sourcing est devenu un acteur de référence sur le marche européen de l'objet promotionnel
  • Couverture multi-pays (FR, UK, DE, ES, IT) avec 250+ fournisseurs références
  • Des centaines de milliers de produits avec variantes, marquages, docs - base de 15 Go
  • 50+ mini-sites distributeurs personnalisés actifs
  • 12 fonctionnalités pleinement opérationnelles livrées : import catalogues, import massif, mise a jour auto, extranet multi-roles, recherche avancee, export CSV/PDF, mini-sites, abonnements, statistiques, publicites, newsletters, gestion multilingue
Métriques du codebase
Types d'import - Nombre de champs CSV par type

Les lendemains du projet

Que s'est-il passe après le déploiement final

Suite immediate (2019) : Les backups exhaustifs de mars et aout 2019 (incluant bash_history, clés SSH, captures d'écran et multiples dumps SQL) suggèrent une phase de transition - probablement liée a un départ ou un archivage. Le backup d'aout 2019 comprend 441 captures d'écran documentant systematiquement l'ensemble de l'écosystème.

A moyen terme : Le dernier fichier modifié dans le backup date de novembre 2019. L'exhaustivité de la documentation (pages wiki, documents de processus, scripts de déploiement) indique un effort conscient d'assurer le transfert de connaissances.

État actuel : Le projet est archive. La plateforme European Sourcing a continue a fonctionner de manière independante, mais le codebase original tel que documenté dans ces backups représente un instantane d'un système mature de 12 ans a son état final. Les choix techniques (Symfony v2, Docker, files d'attente asynchrones) ont démontré la conscience de l'équipe quant a la nécessite de modernisation.

La longévité de l'architecture initiale (12 ans de production) valide nombre de choix de conception originaux, en particulier la séparation front/back MySQL et la stratégie de denormalisation pour les performances de recherche multilingue.

Mon regard critique

Rétrospective honnete sur 12 ans d'ingénierie

Points forts
  • Pérennité

    Le système a fonctionne pendant 12+ ans - preuve d'une architecture fondamentalement solide

  • Couverture fonctionnelle large

    Import, export, recherche, mini-sites, paiements, stats, newsletters - le tout avec une équipe relativement réduite

  • Denormalisation pragmatique

    Les tables précalculées par langue (__es_produits_selection_fr/en/de/es/it) ont effectivement résolu les performances de recherche

  • Architecture MySQL mature

    La séparation lecture/écriture avec load balancing ProxySQL était en avance pour un monolithe PHP

  • Automatisation des flux fournisseurs

    Le système de mise a jour FTP/XML couvrait les principaux fournisseurs, réduisant drastiquement la saisie manuelle

Points d'amélioration
  • Framework custom

    Un framework PHP maison au lieu de Symfony/Laravel a créé une dette technique importante et rendu le recrutement plus difficile

  • Lacunes de sécurité

    Credentials en clair dans le code et la config, requêtes SQL parfois non parametrees, pas de CORS/CSP

  • Absence de tests

    Aucun test unitaire ou d'intégration dans la version legacy, rendant chaque évolution risquée

  • Code spécifique par fournisseur

    auto_mise_a_jour.php contient de la logique en dur par fournisseur au lieu d'un pattern générique de connecteurs/adaptateurs

  • Pas de CI/CD

    Déploiement manuel via SVN export et scripts shell, aucun pipeline de test ou déploiement automatisé

Ce que j'aurais fait différemment
  • Adopter un framework communautaire des le départ (Symfony 1.x existait depuis 2007)
  • Concevoir un système générique de connecteurs fournisseurs avec adaptateurs par format (CSV, XML, JSON) et configuration declarative
  • Implémenter une file d'attente des le debut (RabbitMQ, Beanstalk) plutot que des scripts batch avec set_time_limit
  • Séparer le stockage des docs dans un CDN/S3 au lieu du filesystem local
  • Ajouter des tests automatisés progressivement, en commencant par les fonctions critiques d'import et de correspondance de références
Enseignements durables
  • L'import de données hétérogènes est un problème d'ingénierie majeur - chaque fournisseur a ses propres formats, conventions, encodages et particularites. Un système robuste nécessite une architecture extensible avec adaptateurs, validation et logging exhaustif.

  • La denormalisation est un compromis valide quand les performances de lecture sont critiques et que les données évoluent par batch - mais la synchronisation doit etre automatisée et la coherence monitoree.

  • Les projets a cycle long accumulent inevitablement de la dette technique - planifier des phases de refactoring est essentiel plutot que d'attendre une refonte totale.

  • La migration est un processus, pas un événement - la coexistence du legacy (PHP custom + SVN) et de la v2 (Symfony + Git) sur plusieurs années montre que les migrations se font incrementalement.

Architecture complète de l'écosystème (Draw.io)

Architecture complète de l'écosystème (Draw.io)
Modèle de données principal (diagramme ER)
Flux de données d'un import CSV (v2)
Répartition technologique
Répartition de l'infrastructure

Parcours associe

Experience professionnelle liee a cette realisation

Competences mobilisees

Competences techniques et humaines appliquees

Galerie d'images

Captures et visuels du projet