Contact
Let's work together
Extranet - B2B Catalog Administration Platform

Extranet - B2B Catalog Administration Platform

Complete back-office for managing the largest European online trade show for promotional products - 229K lines of application code, 38 data models, 5 languages, 15 GB database.

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

Lines of Code

229,090

Application code (PHP, JS)

Commits

629

4 active contributors

Data Models

38+

v1 models + 74 Form Types v2

Languages

5

FR, EN, DE, IT, ES

Presentation

Project definition and scope

The Extranet European Sourcing is the central back-office of the European Sourcing platform, the largest European online trade show dedicated to promotional and advertising products. This internal administration tool enables the European Sourcing team (Medialeads) to manage the entire product catalog, suppliers, resellers, advertising services, and platform statistics.

The project went through two major versions: Extranet v1, a custom PHP MVC application with MySQL, developed from the platform's origins and used in production for several years; and Extranet v2 "Rebirth", a complete rewrite under Symfony 3.1 with PostgreSQL and RabbitMQ, initiated on March 14, 2016, aimed at modernizing the architecture and centralizing shared business bundles.

A third associated component, the Supplier Back-Office, is an AngularJS/Node.js single-page application offering suppliers a dedicated space to manage their profile, products, statistics, and contracts.

Domain

B2B promotional products - European online trade show connecting suppliers, resellers, and brands

Target Users

Internal team (sales, catalog managers, administrators) + hundreds of European suppliers (via Supplier BO) + 50+ resellers (via MyEasyWeb)

Functional Scope
Product Catalog ManagementSupplier & CRM ManagementReseller & MyEasyWeb SitesAdvertising ServicesCSV Import/Export (6 steps)Statistics & ReportingMultilingual Management (5 languages)Contracts & Subscriptions
Global Ecosystem Architecture

Objectives, Context, Stakes & Risks

Strategic vision and constraints

Objectives
  • Provide a unified administration tool to manage a catalog of hundreds of thousands of products from hundreds of European suppliers
  • Rewrite the extranet with a modern framework (Symfony 3) to improve maintainability, testability, and code reusability via shared bundles
  • Migrate from MySQL to PostgreSQL and introduce asynchronous messaging with RabbitMQ
  • Offer suppliers an autonomous modern interface (AngularJS SPA) to manage their presence on the platform
Context

The project operates within a complex software ecosystem of 15+ interconnected sub-projects (sourcing front, export, flux/auto-update, API, translation, statistics, MyEasyWeb, etc.). The shared MySQL database weighs approximately 15 GB (uncompressed) and is accessed by all applications.

Infrastructure is hosted on OVH dedicated servers (sql1, sql2 for MySQL, dedicated web servers). Versioning migrated from SVN to GitHub (medialeads organization). Development environments are provisioned via Vagrant + Chef with 25+ cookbooks.

Massive Catalog

Hundreds of thousands of products with translations in 5 languages, multiple attributes, markings, variants, and pricing

B2B Relationships

Tracking supplier subscriptions, contracts, advertising service orders generating the platform revenue

Multi-Site Ecosystem

Extranet data feeds europeansourcing.com, tendanceobjet.com, export site, 50+ MyEasyWeb reseller sites

Identified Risks

v1 to v2 Migration Complexity

Complete rewrite of a production tool used daily, with risk of functional regression and prolonged coexistence of both versions.

Monolithic Database

A single shared MySQL database between 15+ sub-projects creating strong coupling and cascading risks.

v1 Technical Debt

Custom MVC framework without tests, without ORM, with raw SQL queries in models - making every change risky.

MD5 Authentication

Legacy MD5 encoding without salt (0 iterations) for authentication - cryptographically weak even in 2016.

Simplified Entity-Relationship Model

The Steps - What I Did

Chronological phases and personal contributions

Project Timeline
Phase 1 - Extranet v1
Extranet v1 - Custom PHP MVC
2011 - 2016
  • Developed the original extranet with a custom PHP MVC framework - 28 admin controllers, 8 supplier controllers, 38 models
  • Built a 6-step CSV import system: upload, column mapping, validation, preview, insertion, history with rollback
  • Implemented product catalog management with attributes, variants, markings, multi-language translations
  • Created supplier management (CRM), reseller management, MyEasyWeb site creation and backup
  • Developed advertising services: banners, AdWords campaigns, homepage sliders, partner management
  • Built comprehensive statistics module: by supplier, product, reseller, MyEasyWeb, advertisements
  • Authored 97.2% of the v1 application code (98,909 lines out of 101,674)
Phase 2 - Rebirth (Symfony 3)
Extranet v2 - Symfony 3.1 + PostgreSQL
2016 - 2019
  • Participated in the Symfony 3.1 rewrite with PostgreSQL, Doctrine ORM, and RabbitMQ for async messaging
  • Worked with shared business bundles: ESCoreBundle (entities, auth, file system) and ESSourcingBundle (business logic)
  • Implemented generic list system (EntityList) with configurable columns, bulk actions, row actions, and pagination
  • Developed 70+ Form Types for complex entity management (products, variants, markings, imports/exports)
  • Set up Vagrant + Chef provisioning with 25+ cookbooks for reproducible development environments
Phase 3 - Supplier Back-Office
Supplier BO - AngularJS SPA
2014 - 2016
  • Built the supplier self-service SPA with AngularJS and CoffeeScript - authored 99.1% of the code (19,007 lines)
  • Implemented modules: Dashboard, Profile, Contacts, Products, News, Statistics, Contracts
  • Created multilingual interface supporting 5 languages (FR, EN, DE, IT, ES)
  • Integrated with the European Sourcing REST API for all supplier operations
6-Step CSV Import Process
Architecture Comparison v1 vs v2

The Actors - Interactions

Team and stakeholders

Development Team (4 active developers) The core team consisted of 4 developers with distinct areas of expertise. I contributed 266 commits (42.3%) and 117,916 lines of application code (51.5%), being the primary author of v1 (97.2%) and the Supplier BO (99.1%). Thomas C. served as lead developer on the v2 Rebirth, authoring 95.1% of its code. IronXtreme contributed to the v2 Rebirth, and Wamania focused on refactoring and corrections.

Internal Team (Medialeads) 5 additional people were identified in configurations and server access: Jordan and Yves (developers), Francois (DevOps/sysadmin), Yohan (developer), and Guillaume (sales/admin). Collaboration happened through Git branches per developer, a prod branch for production, and an internal DokuWiki for documentation.

  • SQLI: External consulting firm that wrote detailed specifications for the extranet supplier module (ESV3)
  • Systonic: Former hosting provider (2009-2010), before migration to OVH
  • OVH: Primary hosting provider for dedicated servers
  • Suppliers: Hundreds of European promotional product companies - the B2B clients
  • Resellers: 50+ distributors using MyEasyWeb sites powered by the extranet data
Contribution Distribution - Application Code (229,090 lines)
Breakdown by Sub-Project

Results

Impact for me and for the organization

Results for Me: Professional Growth

This project was a foundational experience in my career as a software engineer. Over nearly 5 years of involvement, I developed deep expertise across the full stack: backend PHP development (custom framework then Symfony), relational databases (MySQL and PostgreSQL), frontend SPA development (AngularJS), and DevOps practices (server administration, Vagrant/Chef provisioning, Git workflow).

The scale of the project - hundreds of thousands of products, 15 GB databases, multi-site architecture - taught me to think about performance, scalability, and data integrity at a level impossible to reach on smaller projects. Building the 6-step CSV import system with validation, preview, and rollback capabilities was a masterclass in data engineering.

Leading the development of the Supplier BO as a standalone SPA gave me my first experience with single-page application architecture and API-first design, skills that would prove essential throughout my career.

Results for the Organization: Business Impact

The extranet was the operational heart of European Sourcing. Without this tool, it would have been impossible to manage the catalog of hundreds of thousands of products, supplier relationships, and advertising services that generated the platform's revenue.

  • Catalog Management: Hundreds of thousands of products managed across 5 languages with attributes, variants, markings, and pricing
  • Supplier Network: Hundreds of European suppliers managed with subscriptions, contracts, and dedicated self-service portal
  • Multi-Site Distribution: Data feeding europeansourcing.com, tendanceobjet.com, export site, graphicsourcing, 50+ MyEasyWeb reseller sites
  • Revenue Generation: Advertising services (banners, AdWords, sliders, partner placements) managed entirely through the extranet
  • Operational Efficiency: Internal team of 5-10 people managing the entire European promotional products market through a single unified tool
Technical Metrics
Technology Distribution

The Aftermath

What happened after the project

Immediate Post-Delivery The v1 and v2 coexisted in production for several years, with the v1 continuing to handle daily operations while the v2 Rebirth was being developed module by module. The last complete backups date from March and August 2019, including 15 GB SQL dumps, FTP backups of supplier catalogs, and full server snapshots.

Medium-Term Evolution The European Sourcing platform continued operating as the leading European online trade show for promotional products. The architectural decisions - shared bundles (ESCoreBundle, ESSourcingBundle), PostgreSQL migration, RabbitMQ for async processing - provided a foundation for continued evolution of the platform.

Current State The last detected activity in the archived backups dates from November 2019. The platform's codebase represents a significant body of work: 229,090 lines of application code across 3 sub-projects, 629 commits from 4 developers, serving an ecosystem of public sites reaching the European B2B promotional products market.

Career Impact This experience at European Sourcing/Medialeads was instrumental in shaping my approach to large-scale web development. The lessons learned about managing complex data models, building multi-tenant architectures, and working with massive datasets directly informed my subsequent work on even more ambitious projects.

Critical Reflection

Honest retrospective analysis

What Worked Well
  • Extremely rich functional scope: the extranet covers every administration need of a complex B2B platform - catalog, suppliers, resellers, advertising, statistics, import/export, multilingual
  • Modular architecture (v2): the decision to create shared bundles (ESCoreBundle, ESSourcingBundle) to mutualize code between sub-projects was a pertinent architectural choice
  • Courageous technology migration: moving from a custom framework to Symfony 3 and from MySQL to PostgreSQL shows a willingness to modernize
  • Automated provisioning: using Vagrant + Chef for v2 guarantees reproducible development environments
  • Interface separation: the Supplier BO as a separate AngularJS SPA provides a better user experience for suppliers
What I Would Do Differently
  • Use a standard framework from the start: Symfony 2 existed in 2011 and would have provided ecosystem benefits, tests, and documentation from day one
  • Implement CI/CD from the beginning: GitHub Actions didn't exist yet, but Travis CI or Jenkins were available and would have caught regressions earlier
  • Separate the database: into microservices or at least distinct schemas to reduce the strong coupling between 15+ sub-projects
  • Use bcrypt or argon2: for password hashing instead of the legacy MD5 without salt
  • Adopt Docker instead of Vagrant + Chef: for lighter and more portable provisioning
  • Favor incremental migration: over the "big rewrite" approach - migrating module by module would have been more pragmatic than a full rewrite that coexisted with v1 for years
Lasting Lessons
  • The "big rewrite" is risky: the coexistence of v1 and v2 for several years shows that migration is a long, complex process. An incremental approach would have been more pragmatic
  • Shared bundles are a long-term investment: mutualizing business code between sub-projects reduces duplication but creates strong dependencies and requires good version management
  • Data import is a full engineering problem: the 6-step CSV import system with validation, preview, and history demonstrates the complexity of mass data management
  • Documenting architecture is essential: when the number of sub-projects and developers grows, documentation becomes critical for onboarding and maintenance

Related journey

Professional experience linked to this achievement

Skills applied

Technical and soft skills applied

Image gallery

Project screenshots and visuals