---
title: "Extranet PIM pour Moteur de Recherche B2B d'Objets Publicitaires (European Sourcing)"
description: "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."
locale: "fr"
canonical: "https://portfolio.josedacosta.info/fr/realisations/extranet-pim-b2b-objets-publicitaires"
source: "https://portfolio.josedacosta.info/fr/realisations/extranet-pim-b2b-objets-publicitaires.md"
html_source: "https://portfolio.josedacosta.info/fr/realisations/extranet-pim-b2b-objets-publicitaires"
author: "José DA COSTA"
date: "2014"
type: "achievement"
slug: "extranet-pim-b2b-objets-publicitaires"
tags: ["PHP 5.x", "Symfony 3.1", "MySQL", "PostgreSQL", "Doctrine ORM", "RabbitMQ", "AngularJS", "Node.js", "jQuery", "Bootstrap 3", "Vagrant", "Chef"]
generated_at: "2026-05-26T15:39:03.578Z"
---

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

**Date:** 2011 - 2016  
**Durée:** ~6 ans  
**Rôle:** Software Engineer puis Senior Software Engineer  
**Technologies:** PHP 5.x, Symfony 3.1, MySQL, PostgreSQL, Doctrine ORM, RabbitMQ, AngularJS, Node.js, jQuery, Bootstrap 3, Vagrant, Chef

### Indicateurs clés

- Lignes de code: **-** - Code applicatif (PHP, JS)
- Merge Requests: **-** - 4 contributeurs actifs
- Base de données: **-**
- Langues: **-** - FR, EN, DE, ES, IT, NL, PT

## Présentation

_Définition et périmètre du projet_

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

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.

### 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

## Objectifs, Contexte, Enjeux et Risques

_Vision stratégique et contraintes_

### 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

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

### 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

### Enjeux

### Risques identifiés

## Les étapes - Ce que j'ai fait

_Phases chronologiques et contributions personnelles_

### Chronologie du projet

### Phase 1 - Extranet v1 (2011 - 2016)

- J'ai développé l'extranet original sur un framework PHP MVC maison
- Côté ingestion de données, j'ai bâti un système d'import CSV en 6 étapes : upload, mapping colonnes, validation, aperçu, insertion, historique avec rollback
- Pour alimenter le catalogue en continu, j'ai construit et maintenu **37 connecteurs d'import automatisés distincts** (FTP, HTTP, API REST - dont Pixika, Makito, Midocean, BIC, Paul Stricker, Clipper, TopTex, Cybernecard, etc.)
- Sur le catalogue produits, j'ai implémenté la gestion complète : attributs, variantes, marquages, traductions multilingues
- Côté CRM, j'ai créé la gestion des fournisseurs, des revendeurs ainsi que la création et le backup des sites MyEasyWeb
- Sur le volet publicité, j'ai développé les services : bannières, campagnes AdWords, sliders homepage, gestion des partenaires
- Pour outiller le pilotage, j'ai construit un module complet de statistiques : par fournisseur, produit, revendeur, MyEasyWeb, publicités

### Phase 2 - Rebirth (Symfony 3) (2016 - 2019)

- J'ai pris part à la réécriture Symfony 3.1 (initiée le 14 mars 2016) avec PostgreSQL, Doctrine ORM et RabbitMQ pour la messagerie asynchrone
- Côté mutualisation, j'ai travaillé sur les bundles métier partagés : ESCoreBundle (entités, auth, système de fichiers) et ESSourcingBundle (logique métier)
- Pour industrialiser les écrans d'administration, j'ai implémenté un système de listes génériques (EntityList) avec colonnes configurables, actions en masse, actions par ligne et pagination
- Sur le volet formulaires, j'ai développé 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
- Pour sécuriser la refonte, j'ai mis en place une suite de tests PHPUnit complète avec 611 fichiers de tests validant entités, contrôleurs et logique métier
- Côté DevOps, j'ai configuré le provisionnement Vagrant + Chef avec 25+ cookbooks pour des environnements de développement reproductibles

### Phase 3 - Supplier Back-Office (2014 - 2016)

- J'ai construit la SPA fournisseur en AngularJS et CoffeeScript (19 007 lignes)
- Côté fonctionnel, j'ai implémenté les modules : Dashboard, Profil, Contacts, Produits, Actualités, Statistiques, Contrats
- Sur le plan i18n, j'ai livré une interface multilingue supportant 7 langues (FR, EN, DE, ES, IT, NL, PT)
- Pour connecter la SPA à l'écosystème, je l'ai intégrée avec l'API REST European Sourcing pour toutes les opérations fournisseur

## Les acteurs - Les interactions

_Avec qui j'ai interagi directement et comment j'ai collaboré_

### Répartition des contributions - Code applicatif (229 090 lignes)

**Équipe de développement - mes coéquipiers au quotidien (4 développeurs actifs)**
Au sein de cette équipe resserrée, j'ai contribué à **629 merge requests** et **117 916 lignes de code applicatif** - j'étais l'auteur principal de la v1 et du Supplier BO. À mes côtés, Thomas C. tenait le rôle de développeur principal sur le v2 Rebirth ; IronXtreme renforçait ponctuellement le v2 Rebirth et Wamania se concentrait sur le refactoring et les corrections.

**Parties prenantes externes avec qui j'ai interagi**
- **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) ; j'ai ensuite piloté avec l'équipe la migration de toute l'infrastructure vers OVH
- **OVH** : fournisseur principal des serveurs dédiés - nous assurions nous-mêmes toute l'administration système (provisionnement, configuration, durcissement sécurité, monitoring, sauvegardes) et j'y prenais une part active
- **Fournisseurs** : des centaines d'entreprises européennes d'objets publicitaires, clients B2B dont j'étais l'interlocuteur technique via l'extranet
- **Revendeurs** : 50+ distributeurs utilisant les sites MyEasyWeb que j'alimentais depuis l'extranet

## Résultats

_Impact pour moi et pour l'entreprise_

### Résultats pour moi : Croissance professionnelle

Ce projet a été pour moi une expérience fondatrice dans ma carrière d'ingénieur logiciel. Sur **près 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, exceptionnel à 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. Ce projet a changé ma façon de travailler : j'ai appris à penser **performance, scalabilité et intégrité des données** à un niveau impossible à atteindre sur des projets plus petits, en me confrontant quotidiennement à 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 aux **stratégies de sauvegarde de la donnée à grande échelle**.

**Moteurs de recherche et indexation** : je suis passé progressivement 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. Cette traversée m'a permis de saisir en profondeur les différences entre un moteur relationnel et un moteur de recherche.

**Algorithmes et règles métier complexes** : j'ai conçu et implémenté de nombreux algorithmes et 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). La **modélisation de règles de pricing dynamiques** et des **moteurs de décision métier** fait désormais partie de ma boîte à outils.

### 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

### Métriques techniques

## 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

_Avec le recul, comment je juge ce projet_

### Ce qui a bien fonctionné

- **Périmètre fonctionnel extrêmement riche** : avec le recul, je mesure combien l'extranet couvre l'intégralité des besoins d'administration d'une plateforme B2B complexe - catalogue, fournisseurs, revendeurs, publicité, statistiques, import/export, multilingue
- **Architecture modulaire (v2)** : je revendique la création des bundles partagés (ESCoreBundle, ESSourcingBundle) pour mutualiser le code entre sous-projets - un choix qui a tenu dans la durée
- **Migration technologique courageuse** : passer d'un framework maison à Symfony 3 et de MySQL à PostgreSQL nous a demandé du cran, et je le referais sans hésiter
- **Provisionnement automatisé** : en poussant Vagrant + Chef sur le v2, j'ai sécurisé la reproductibilité des environnements de développement

### Ce que j'aurais fait différemment

- **Mettre en place une CI/CD dès le début** : j'aurais posé un pipeline avec Travis CI ou Jenkins dès la création du projet (GitHub Actions n'existait pas encore)
- **Séparer la base de données** : j'aurais découpé la base monolithique 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** : j'aurais basculé plus tôt vers Docker pour un provisionnement plus léger et portable

### Les enseignements durables que ce projet m'a apportés

- **Les bundles partagés sont un investissement à long terme** : j'ai vu comment mutualiser le code métier réduit la duplication mais crée des dépendances fortes et exige une bonne gestion des versions
- **L'import de données est un problème d'ingénierie à part entière** : après avoir porté le système d'import CSV en 6 étapes, je traite désormais la gestion de données en masse comme un chantier à part entière
- **Documenter l'architecture est essentiel** : j'ai vécu que lorsque le nombre de sous-projets et de développeurs augmente, la documentation devient critique - je l'applique désormais systématiquement

## Compétences mobilisées

_Compétences techniques et humaines appliquées_

- **[Résolution de Problèmes & Adaptabilité](https://portfolio.josedacosta.info/fr/competences/resolution-de-problemes-adaptabilite.md)** - Modélisation de règles métier complexes (pricing dynamique, variantes de marquage, multi-devises) - certains fournisseurs jusqu'à 15 000 variations par produit. Reprise du projet de SQLI en 2014, puis pilotage de la réécriture du MVC custom vers Symfony 3.1 + PostgreSQL + RabbitMQ
- **[Architecture Logicielle & Système](https://portfolio.josedacosta.info/fr/competences/architecture-logicielle-systeme.md)** - Modèle PIM/données plus complexe qu'Akeneo : 32+ champs/variante, 36 par marquage, 50+ grilles tarifaires, 97 tables MySQL, 15 Go. API REST European Sourcing consommée par le Supplier BO SPA et les services aval dans 7 langues. Bundles Symfony partagés (ESCoreBundle, ESSourcingBundle), 70+ Form Types, EntityList générique, MVC + SPA + ETL
- **[Développement Fullstack](https://portfolio.josedacosta.info/fr/competences/developpement-fullstack.md)** - PHP MVC custom puis Symfony 3.1, Doctrine ORM, RabbitMQ async, MySQL puis PostgreSQL sur 5+ ans - 229K lignes sur l'Extranet v1, le v2 Rebirth et le Supplier BO (SPA AngularJS) - ownership full-stack
- **[DevOps, Cloud & Industrialisation Production](https://portfolio.josedacosta.info/fr/competences/devops-cloud-industrialisation-production.md)** - Suite de tests PHPUnit avec 611 fichiers validant entités, controllers et logique métier sur le v2 Rebirth, Serveurs dédiés OVH auto-administrés : provisionnement Vagrant + Chef, 25+ cookbooks, Apache, sécurité, monitoring, sauvegardes
- **[Données, IA & Machine Learning](https://portfolio.josedacosta.info/fr/competences/donnees-ia-machine-learning.md)** - MySQL puis PostgreSQL avec Doctrine, pipeline d'import CSV en 6 étapes, 37 connecteurs fournisseurs FTP/HTTP/REST
- **[Reverse Engineering & Algorithmes](https://portfolio.josedacosta.info/fr/competences/reverse-engineering-algorithmes.md)** - Moteur de pricing combinatoire : milliers de combinaisons par produit (tailles × coloris × marquages × zones × finitions)

## Parcours associé

_Expérience professionnelle liée à cette réalisation_

- **Software Engineer · développeur PHP Zend Framework**

## 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 accès partenaires, espace documents contractuels et suivi des commandes. Parlons de votre contexte.

**Contactez-moi**
