---
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-04-23T15:46:31.313Z"
---

# 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  
**Duration:** ~6 ans  
**Role:** 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

### Key Metrics

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

### Domain

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

### Target Users

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

**Content:** 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.

**Domain:** Domaine

**Target Users:** Utilisateurs cibles

**Functional Scope:** Périmètre fonctionnel

**Scope Catalog:** Gestion du catalogue produits

**Scope Suppliers:** Gestion des fournisseurs et CRM

**Scope Resellers:** Revendeurs et sites MyEasyWeb

**Scope Advertising:** Services publicitaires

**Scope Import:** Import/Export CSV (6 étapes)

**Scope Stats:** Statistiques et reporting

**Scope Multilingual:** Gestion multilingue (7 langues)

**Scope Contracts:** Contrats et abonnements

## Objectifs, Contexte, Enjeux et Risques

_Vision stratégique et contraintes_

### Context

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.

### Stake Catalog

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.

### Stake Relations

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

### Stake Multi Site

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

- 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

**Objectives:** Objectifs

**Context:** Contexte

**Stakes:** Enjeux

**Stake Catalog:** Catalogue massif

**Stake Relations:** Relations commerciales B2B

**Stake Multi Site:** Écosystème multi-sites

**Risks:** Risques identifiés

**Risk1 Title:** Complexité de la migration v1 vers v2

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

**Risk2 Title:** Base de données monolithique

**Risk2 Desc:** 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.

**Risk3 Title:** Dette technique v1

**Risk3 Desc:** 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
- Phase 2 - Rebirth (Symfony 3)
- Phase 3 - Supplier Back-Office

**Phase1 Period:** 2011 - 2016

**Phase2 Period:** 2016 - 2019

**Phase3 Period:** 2014 - 2016

## Les acteurs - Les interactions

_Équipe et parties prenantes_

**Content:** **É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.

**Parties prenantes externes**
- **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ésultats

_Impact pour moi et pour l'entreprise_

### For Me

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

### For Company

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

**For Me:** Résultats pour moi : Croissance professionnelle

**For Company:** Résultats pour l'entreprise : Impact business

## Les lendemains du projet

_Ce qui s'est passe après_

**Content:** **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_

### What Worked

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

### What Would Change

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

### Lessons

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

**What Worked:** Ce qui a bien fonctionne

**What Would Change:** Ce que j'aurais fait différemment

**Lessons:** Enseignements durables
