Contact
Travaillons ensemble
Extranet PIM pour Moteur de Recherche B2B d'Objets Publicitaires (European Sourcing)

Extranet PIM pour Moteur de Recherche B2B d'Objets Publicitaires (European Sourcing)

Back-office complet pour l'administration du plus grand salon en ligne européen d'objets publicitaires - 229K lignes de code applicatif, 38 modèles de données, 7 langues, 15 Go de base de données.

2011 - 2016
~6 ans
Software Engineer puis Senior Software Engineer
PHP 5.xSymfony 3.1MySQLPostgreSQLDoctrine ORMRabbitMQAngularJSNode.jsjQueryBootstrap 3d3.jsApacheVagrantChefGitPHPUnit

Lignes de code

229 090

Code applicatif (PHP, JS)

Merge Requests

629

4 contributeurs actifs

Base de données

38+

Langues

7

FR, EN, DE, ES, IT, NL, PT

Présentation

Définition et périmètre du projet

L'Extranet European Sourcing est le back-office central de la plateforme European Sourcing, le plus grand salon en ligne européen dédié a l'objet publicitaire et promotionnel. Cet outil d'administration interne permet a l'équipe European Sourcing - opérant sous le nom de Medialeads, la division développement informatique et conseil informatique d'European Sourcing - de gérer l'intégralité du catalogue produits, des fournisseurs, des revendeurs, des services publicitaires et des statistiques de la plateforme.

Initialement conçu par le cabinet SQLI (Phase 1, 2008-2013) avec des spécifications fonctionnelles et techniques détaillées - reflet de l'état de l'art du conseil de l'époque - le projet a été repris par l'équipe interne en 2014 pour rapprocher le développement du métier et accélérer les itérations. Le projet a ensuite connu deux versions majeures : l'Extranet v1, une application PHP custom (framework MVC maison) avec MySQL, utilisee en production pendant plusieurs années ; et l'Extranet v2 "Rebirth", une réécriture complète sous Symfony 3.1 avec PostgreSQL et RabbitMQ, initiee le 14 mars 2016, visant a moderniser l'architecture et centraliser les bundles métier partages.

Un troisieme composant associe, le Supplier Back-Office, est une application AngularJS/Node.js en SPA offrant aux fournisseurs un espace dédié pour gérer leur profil, produits, statistiques et contrats.

Domaine

Objet publicitaire B2B - salon professionnel en ligne connectant fournisseurs, revendeurs et marques européens

Utilisateurs cibles

Équipe interne (commerciaux, responsables catalogue, administrateurs) + 800+ fournisseurs européens (via Supplier BO) + 50+ revendeurs (via MyEasyWeb)

Périmètre fonctionnel
Gestion du catalogue produits
Gestion des fournisseurs et CRM
Revendeurs et sites MyEasyWeb
Services publicitaires
Import/Export CSV (6 étapes)
Statistiques et reporting
Gestion multilingue (7 langues)
Contrats et abonnements
Architecture globale de l'écosystème

Objectifs, Contexte, Enjeux et Risques

Vision stratégique et contraintes

Objectifs
  • Fournir un outil d'administration unifie pour gérer un catalogue de centaines de milliers de produits de centaines de fournisseurs européens
  • Reecrire l'extranet avec un framework moderne (Symfony 3) pour améliorer la maintenabilité, la testabilité et la réutilisabilité du code via des bundles partages
  • Migrer de MySQL vers PostgreSQL et introduire la messagerie asynchrone avec RabbitMQ
  • Offrir aux fournisseurs une interface autonome et moderne (SPA AngularJS) pour gérer leur presence sur la plateforme
Contexte

Le projet évolué dans un écosystème logiciel complexe de 15+ sous-projets interconnectes (sourcing front, export, flux/auto-MAJ, API, traduction, statistiques, MyEasyWeb, etc.). La base de données MySQL partagee pese environ 15 Go (non compressee) répartie sur 97 tables, et est accédée par toutes les applications.

L'infrastructure est hébergée sur des serveurs dédiés OVH (sql1, sql2 pour MySQL, serveurs web dédiés). Le versioning a migré de SVN vers GitHub (organisation medialeads) en janvier 2016. Les environnements de développement sont provisionnes via Vagrant + Chef avec 25+ cookbooks.

Catalogue massif

Des millions de produits avec leurs variations dans 7 langues, 32+ champs par fiche produit/variante, 36 champs par option de marquage, jusqu'à 50+ grilles tarifaires dégressives par produit, 32 devises gérées (taux BCE). Certains fournisseurs comme SOL's maintenaient jusqu'à 15 000 variations pour un seul produit (par exemple un T-shirt décliné en tailles, coloris, col V ou col rond, avec ou sans manches, finitions, etc.). Une complexité de PIM / modèle de données qui était l'état de l'art à l'époque pour ce type de catalogue B2B - un niveau de modélisation que les PIM du marché n'ont commencé à approcher que des années plus tard.

Relations commerciales B2B

Suivi des abonnements fournisseurs, contrats, commandes de services publicitaires generant le chiffre d'affaires

Écosystème multi-sites

Les données alimentent europeansourcing.com, tendanceobjet.com, le site export, 50+ sites MyEasyWeb revendeurs

Risques identifiés

Complexité de la migration v1 vers v2

Réécriture complète d'un outil en production utilise quotidiennement, avec risque de régression fonctionnelle et coexistence prolongee des deux versions.

Base de données monolithique

Une seule base MySQL partagée entre 15+ sous-projets - un pattern d'architecture aligné sur les pratiques de la fin des années 2000, devenu un défi structurel au fil de la croissance de la plateforme.

Dette technique v1

Framework MVC maison reflétant l'état de l'art PHP des années 2008-2010 (avant la généralisation de Symfony 2 et des ORM modernes) - de plus en plus exigeant à faire évoluer au fil de la croissance de l'écosystème.

Les étapes - Ce que j'ai fait

Phases chronologiques et contributions personnelles

Phase 1 - Extranet v1
Extranet v1 - Custom PHP MVC
2011 - 2016
  • Développement de l'extranet original avec un framework PHP MVC maison

  • Construction d'un système d'import CSV en 6 étapes : upload, mapping colonnes, validation, apercu, insertion, historique avec rollback

  • Construction et maintenance de 37 connecteurs d'import automatisés distincts (FTP, HTTP, API REST - dont Pixika, Makito, Midocean, BIC, Paul Stricker, Clipper, TopTex, Cybernecard, etc.)

  • Implémentation de la gestion du catalogue produits avec attributs, variantes, marquages, traductions multilingues

  • Création de la gestion des fournisseurs (CRM), des revendeurs, création et backup des sites MyEasyWeb

  • Développement des services publicitaires : bannieres, campagnes AdWords, sliders homepage, gestion des partenaires

  • Construction d'un module complet de statistiques : par fournisseur, produit, revendeur, MyEasyWeb, publicites

  • Auteur de 97,2 % du code applicatif v1 (98 909 lignes sur 101 674)

Phase 2 - Rebirth (Symfony 3)
Extranet v2 - Symfony 3.1 + PostgreSQL
2016 - 2019
  • Participation a la réécriture Symfony 3.1 (initiée le 14 mars 2016) avec PostgreSQL, Doctrine ORM et RabbitMQ pour la messagerie asynchrone

  • Travail avec les bundles métier partages : ESCoreBundle (entites, auth, système de fichiers) et ESSourcingBundle (logique métier)

  • Implémentation du système de listes génériques (EntityList) avec colonnes configurables, actions en masse, actions par ligne et pagination

  • Développement de 70+ Form Types Symfony couvrant produits, variantes, images produit, marquages (statiques/dynamiques avec profils), attributs (simples/multiples/groupes), catégories, mots-clés, labels avec synonymes, abonnements et workflows d'import/export

  • Mise en place d'une suite de tests PHPUnit complète avec 611 fichiers de tests validant entités, contrôleurs et logique métier

  • Mise en place du provisionnement Vagrant + Chef avec 25+ cookbooks pour des environnements de développement reproductibles

Phase 3 - Supplier Back-Office
Supplier BO - AngularJS SPA
2014 - 2016
  • Construction de la SPA fournisseur en AngularJS et CoffeeScript (19 007 lignes)

  • Implémentation des modules : Dashboard, Profil, Contacts, Produits, Actualites, Statistiques, Contrats

  • Création d'une interface multilingue supportant 7 langues (FR, EN, DE, ES, IT, NL, PT)

  • Intégration avec l'API REST European Sourcing pour toutes les operations fournisseur

Processus d'import CSV en 6 étapes
Comparaison architecturale v1 vs v2

Extranet v1

Extranet v2 Rebirth

Les acteurs - Les interactions

Équipe et parties prenantes

Équipe de développement (4 développeurs actifs) L'équipe principale comptait 4 développeurs avec des domaines d'expertise distincts. J'ai contribue 629 merge requests et 117 916 lignes de code applicatif, étant l'auteur principal de la v1 et du Supplier BO. Thomas C. était le développeur principal du v2 Rebirth. IronXtreme a contribue au v2 Rebirth, et Wamania se concentrait sur le refactoring et les corrections.

  • SQLI : cabinet de conseil externe (Phase 1, 2008-2013) - j'y ai rédigé 47+ documents de spécifications détaillées pour le module extranet fournisseur (ESV3) - couvrant spécifications fonctionnelles, spécifications techniques, guides d'exploitation et d'installation, modèle de données, et référentiel d'exigences
  • Systonic : ancien hébergeur (2009-2010), avant que nous ne migrions l'ensemble de l'infrastructure vers OVH
  • OVH : fournisseur principal des serveurs dédiés - nous assurions nous-mêmes l'ensemble de l'administration système (provisionnement, configuration, durcissement sécurité, monitoring, sauvegardes)
  • Fournisseurs : centaines d'entreprises européennes d'objets publicitaires - les clients B2B
  • Revendeurs : 50+ distributeurs utilisant les sites MyEasyWeb alimentes par les données de l'extranet
Répartition des contributions - Code applicatif (229 090 lignes)

Résultats

Impact pour moi et pour l'entreprise

Résultats pour moi : Croissance professionnelle

Ce projet a été une experience fondatrice dans ma carriere d'ingénieur logiciel. Sur pres de 5 ans d'implication, j'ai développé une expertise approfondie sur l'ensemble de la stack : développement backend PHP (framework custom puis Symfony), bases de données relationnelles (MySQL et PostgreSQL), développement frontend SPA (AngularJS) et pratiques DevOps (administration serveur, provisionnement Vagrant/Chef, workflow Git).

Un projet à dimension XXL, exceptionnelle à tous les niveaux : l'Extranet était le cerveau d'orchestration de tout un écosystème - 9,1 M de lignes de code au total, 7 510+ fichiers PHP, 4 510+ fichiers JavaScript, 910+ controllers, 2 220+ vues/templates, et un moteur de recherche indexant 22 000+ mots issu de cet Extranet. Cela a rendu ce projet extrêmement formateur sur la manipulation de la donnée, l'architecture de la donnée, la complexité des règles métier, la gestion d'infrastructure et de serveurs, et les stratégies de sauvegarde de la donnée à grande échelle - m'a appris à penser performance, scalabilité et intégrité des données à un niveau impossible à atteindre sur des projets plus petits.

Moteurs de recherche et indexation : passage progressif de l'indexation native en base (MySQL full-text MyISAM/InnoDB, puis recherche full-text PostgreSQL avec `tsvector`/`tsquery`, index GIN et fonctions `to_tsvector`/`ts_rank`) à un vrai moteur de recherche avec Elasticsearch - inverted index, analyzers multilingues (stemming, tokenization, normalisation), scoring TF-IDF, agrégations, facettes. Apprentissage des différences profondes entre un moteur relationnel et un moteur de recherche.

Algorithmes et règles métier complexes : conception et implémentation de nombreux algorithmes et de règles métier très complexes - par exemple le calcul de toutes les combinaisons possibles de prix, de variantes produit et de disponibilité (produit cartésien / explosion combinatoire pouvant générer des milliers de combinaisons par produit entre tailles, coloris, quantités, types de marquage, zones de marquage et finitions). Maîtrise de la modélisation de règles de pricing dynamiques et de moteurs de décision métier.

Résultats pour l'entreprise : Impact business

L'extranet était le coeur opérationnel d'European Sourcing. Sans cet outil, il aurait été impossible de gérer le catalogue de centaines de milliers de produits, les relations fournisseurs et les services publicitaires qui généraient le chiffre d'affaires de la plateforme.

  • Gestion du catalogue : centaines de milliers de produits gérés dans 7 langues avec attributs, variantes, marquages et tarification
  • Recherche multilingue : 7 index Elasticsearch dédiés (un par langue) propulsant la recherche full-text sur l'ensemble du catalogue produits de la plateforme
  • Réseau fournisseurs : 800+ fournisseurs européens gérés avec abonnements, contrats et portail self-service dédié
  • Distribution multi-sites : données alimentant europeansourcing.com, tendanceobjet.com, le site export, graphicsourcing, 50+ sites MyEasyWeb revendeurs
  • Génération de revenus : services publicitaires (bannieres, AdWords, sliders, placements partenaires) gérés entièrement via l'extranet
  • Efficacite opérationnelle : équipe interne de 5-10 personnes gérant l'ensemble du marche européen de l'objet promotionnel via un outil unifie

Les lendemains du projet

Ce qui s'est passe après

Après la livraison La v1 et la v2 ont coexiste en production pendant plusieurs années, la v1 continuant de gérer les operations quotidiennes tandis que le v2 Rebirth était développé module par module. La v2 est encore en fonctionnement aujourd'hui et continue de propulser la plateforme European Sourcing.

Impact sur ma carriere Cette experience chez European Sourcing - au sein de Medialeads, sa division développement informatique et conseil informatique - a été déterminante dans ma façon d'aborder le développement web a grande échelle. Les leçons apprises sur la gestion de modèles de données complexes, la construction d'architectures multi-tenant et le travail avec des jeux de données massifs ont directement influence mon travail ulterieur sur des projets encore plus ambitieux.

Mon regard critique

Analyse rétrospective honnete

Ce qui a bien fonctionne
  • Périmètre fonctionnel extremement riche : l'extranet couvre l'intégralité des besoins d'administration d'une plateforme B2B complexe - catalogue, fournisseurs, revendeurs, publicite, statistiques, import/export, multilingue
  • Architecture modulaire (v2) : la création de bundles partages (ESCoreBundle, ESSourcingBundle) pour mutualiser le code entre les sous-projets est un choix architectural pertinent
  • Migration technologique courageuse : passer d'un framework maison a Symfony 3 et de MySQL a PostgreSQL montre une volonté de modernisation
  • Provisionnement automatisé : l'utilisation de Vagrant + Chef pour le v2 garantit la reproductibilité des environnements de développement
Ce que j'aurais fait différemment
  • Mettre en place une CI/CD des le debut : GitHub Actions n'existait pas encore, mais Travis CI ou Jenkins étaient disponibles
  • Séparer la base de données : en microservices ou au moins en schémas distincts pour réduire le couplage fort entre 15+ sous-projets
  • Adopter Docker au lieu de Vagrant + Chef : pour un provisionnement plus leger et portable
Enseignements durables
  • Les bundles partages sont un investissement a long terme : mutualiser le code métier réduit la duplication mais créé des dépendances fortes et nécessite une bonne gestion des versions
  • L'import de données est un problème d'ingénierie a part entière : le système d'import CSV en 6 étapes démontré la complexité de la gestion de données en masse
  • Documenter l'architecture est essentiel : quand le nombre de sous-projets et de développeurs augmente, la documentation devient critique

Parcours associé

Expérience professionnelle liée à cette réalisation

Compétences mobilisées

Compétences techniques et humaines appliquées

Galerie d'images

Captures et visuels du projet

Vous avez un extranet partenaires a concevoir ?

J'ai livre l'extranet European Sourcing : gestion fine des acces partenaires, espace documents contractuels et suivi des commandes. Parlons de votre contexte.

Contactez-moi