Contact
Travaillons ensemble
Extranet - Plateforme d'Administration de Catalogue B2B

Extranet - Plateforme d'Administration de Catalogue B2B

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, 5 langues, 15 Go de base de données.

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

Lignes de code

229,090

Code applicatif (PHP, JS)

Commits

629

4 contributeurs actifs

Modeles de données

38+

Modeles v1 + 74 Form Types v2

Langues

5

FR, EN, DE, IT, ES

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 (Medialeads) de gérer l'intégralité du catalogue produits, des fournisseurs, des revendeurs, des services publicitaires et des statistiques de la plateforme.

Le projet a connu deux versions majeures : l'Extranet v1, une application PHP custom (framework MVC maison) avec MySQL, développée des les origines de la plateforme et 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) + centaines de fournisseurs européens (via Supplier BO) + 50+ revendeurs (via MyEasyWeb)

Périmètre fonctionnel
Gestion du catalogue produitsGestion des fournisseurs et CRMRevendeurs et sites MyEasyWebServices publicitairesImport/Export CSV (6 étapes)Statistiques et reportingGestion multilingue (5 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) 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). Les environnements de développement sont provisionnes via Vagrant + Chef avec 25+ cookbooks.

Catalogue massif

Centaines de milliers de produits avec traductions en 5 langues, attributs multiples, marquages, variantes et prix

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 partagee entre 15+ sous-projets créant un couplage fort et des risques en cascade.

Dette technique v1

Framework MVC maison sans tests, sans ORM, avec des requêtes SQL en dur dans les modèles - rendant chaque modification risquée.

Authentification MD5

Encodage MD5 hérité sans salt (0 iterations) pour l'authentification - cryptographiquement faible même en 2016.

Modèle entite-relation simplifie

Les étapes - Ce que j'ai fait

Phases chronologiques et contributions personnelles

Chronologie du projet
Phase 1 - Extranet v1
Extranet v1 - Custom PHP MVC
2011 - 2016
  • Développement de l'extranet original avec un framework PHP MVC maison - 28 controllers admin, 8 controllers fournisseur, 38 modèles
  • Construction d'un système d'import CSV en 6 étapes : upload, mapping colonnes, validation, apercu, insertion, historique avec rollback
  • 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 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 pour la gestion d'entites complexes (produits, variantes, marquages, imports/exports)
  • 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 - auteur de 99,1 % du code (19 007 lignes)
  • Implémentation des modules : Dashboard, Profil, Contacts, Produits, Actualites, Statistiques, Contrats
  • Création d'une interface multilingue supportant 5 langues (FR, EN, DE, IT, ES)
  • 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

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 266 commits (42,3 %) et 117 916 lignes de code applicatif (51,5 %), étant l'auteur principal de la v1 (97,2 %) et du Supplier BO (99,1 %). Thomas C. était le développeur principal du v2 Rebirth, auteur de 95,1 % de son code. IronXtreme a contribue au v2 Rebirth, et Wamania se concentrait sur le refactoring et les corrections.

Équipe interne (Medialeads) 5 autres personnes identifiees dans les configurations et accès serveurs : Jordan et Yves (développeurs), Francois (DevOps/admin serveur), Yohan (développeur) et Guillaume (commercial/admin). La collaboration se faisait via des branches Git par développeur, une branche prod pour la production et un wiki interne DokuWiki pour la documentation.

  • SQLI : cabinet de conseil ayant rédigé les spécifications détaillées du module extranet fournisseur (ESV3)
  • Systonic : ancien hébergeur (2009-2010), avant migration vers OVH
  • OVH : hébergeur principal pour les serveurs dédiés
  • 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épartition par sous-projet

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).

L'envergure du projet - centaines de milliers de produits, bases de données de 15 Go, architecture multi-sites - m'a appris a penser performance, scalabilité et intégrité des données a un niveau impossible a atteindre sur des projets plus petits. La construction du système d'import CSV en 6 étapes avec validation, apercu et rollback a été un veritable cours magistral d'ingénierie de données.

Le développement du Supplier BO comme SPA autonome m'a donne ma première experience d'architecture single-page application et de design API-first, des compétences qui se sont revelees essentielles tout au long de ma carriere.

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 5 langues avec attributs, variantes, marquages et tarification
  • Réseau fournisseurs : centaines de 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
Métriques techniques
Répartition technologique

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. Les derniers backups complets datent de mars et aout 2019, incluant des dumps SQL de 15 Go, des backups FTP des catalogues fournisseurs et des snapshots complets des serveurs.

Évolution a moyen terme La plateforme European Sourcing a continue de fonctionner comme le premier salon en ligne européen pour les objets publicitaires. Les decisions architecturales - bundles partages (ESCoreBundle, ESSourcingBundle), migration PostgreSQL, RabbitMQ pour le traitement asynchrone - ont fourni une base pour l'évolution continue de la plateforme.

État actuel La dernière activité detectee dans les archives date de novembre 2019. La base de code du projet représente un travail considerable : 229 090 lignes de code applicatif réparties sur 3 sous-projets, 629 commits de 4 développeurs, alimentant un écosystème de sites publics couvrant le marche européen B2B de l'objet promotionnel.

Impact sur ma carriere Cette experience chez European Sourcing/Medialeads 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
  • Séparation des interfaces : le Supplier BO en SPA AngularJS séparée offre une meilleure experience utilisateur pour les fournisseurs
Ce que j'aurais fait différemment
  • Utiliser un framework standard des le départ : Symfony 2 existait en 2011 et aurait apporte les bénéfices de l'écosystème, des tests et de la documentation
  • 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
  • Utiliser bcrypt ou argon2 : pour le hachage des mots de passe au lieu du MD5 hérité sans salt
  • Adopter Docker au lieu de Vagrant + Chef : pour un provisionnement plus leger et portable
  • Privilégier la migration incrémentale : plutot que l'approche "big rewrite" - migrer module par module aurait été plus pragmatique
Enseignements durables
  • La réécriture complète est risquée : la coexistence de la v1 et v2 pendant plusieurs années montre que la migration est un processus long et complexe. Une approche incrémentale aurait été plus pragmatique
  • 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 associe

Experience professionnelle liee a cette realisation

Competences mobilisees

Competences techniques et humaines appliquees

Galerie d'images

Captures et visuels du projet