---
title: "Extranet PIM para Motor de Busca B2B de Brindes Publicitários (European Sourcing)"
description: "Back-office completo para administracao da maior feira online europeia de produtos promocionais - 229K linhas de codigo aplicativo, 38 modelos de dados, 7 idiomas, 15 GB de banco de dados."
locale: "pt"
canonical: "https://portfolio.josedacosta.info/pt/realizacoes/extranet-pim-b2b-objets-publicitaires"
source: "https://portfolio.josedacosta.info/pt/realizacoes/extranet-pim-b2b-objets-publicitaires.md"
html_source: "https://portfolio.josedacosta.info/pt/realizacoes/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:47:47.634Z"
---

# Extranet PIM para Motor de Busca B2B de Brindes Publicitários (European Sourcing)

Back-office completo para administracao da maior feira online europeia de produtos promocionais - 229K linhas de codigo aplicativo, 38 modelos de dados, 7 idiomas, 15 GB de banco de dados.

**Date:** 2011 - 2016  
**Duration:** ~6 anos  
**Role:** Software Engineer depois 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

- Linhas de codigo: **-** - Codigo aplicativo (PHP, JS)
- Merge Requests: **-** - 4 contribuidores ativos
- Banco de dados: **-**
- Idiomas: **-** - FR, EN, DE, ES, IT, NL, PT

## Apresentacao

_Definicao e escopo do projeto_

### Domain

Produtos promocionais B2B - feira profissional online conectando fornecedores, revendedores e marcas europeias

### Target Users

Equipe interna (comerciais, gerentes de catalogo, administradores) + 800+ fornecedores europeus (via Supplier BO) + 50+ revendedores (via MyEasyWeb)

**Content:** O **Extranet European Sourcing** e o back-office central da plataforma European Sourcing, a maior feira online europeia dedicada a produtos publicitarios e promocionais. Esta ferramenta de administracao interna permite a equipe European Sourcing - operando sob o nome **Medialeads**, a **divisao de desenvolvimento de TI e consultoria de TI da European Sourcing** - gerenciar todo o catalogo de produtos, fornecedores, revendedores, servicos de publicidade e estatisticas da plataforma.

Inicialmente concebido pela consultoria **SQLI (Fase 1, 2008-2013)** com especificacoes funcionais e tecnicas detalhadas - reflexo do estado da arte da consultoria da epoca - o projeto foi **assumido pela equipe interna em 2014** para aproximar o desenvolvimento do negocio e acelerar as iteracoes. O projeto entao passou por **duas versoes principais**: o **Extranet v1**, uma aplicacao PHP personalizada (framework MVC proprio) com MySQL, usada em producao por varios anos; e o **Extranet v2 "Rebirth"**, uma reescrita completa em **Symfony 3.1** com **PostgreSQL** e **RabbitMQ**, iniciada em **14 de marco de 2016**, visando modernizar a arquitetura e centralizar bundles de negocio compartilhados.

Um terceiro componente associado, o **Supplier Back-Office**, e uma aplicacao **AngularJS/Node.js** SPA oferecendo aos fornecedores um espaco dedicado para gerenciar perfil, produtos, estatisticas e contratos.

**Domain:** Dominio

**Target Users:** Usuarios-alvo

**Functional Scope:** Escopo funcional

**Scope Catalog:** Gestao do catalogo de produtos

**Scope Suppliers:** Gestao de fornecedores e CRM

**Scope Resellers:** Revendedores e sites MyEasyWeb

**Scope Advertising:** Servicos de publicidade

**Scope Import:** Importacao/Exportacao CSV (6 etapas)

**Scope Stats:** Estatisticas e relatorios

**Scope Multilingual:** Gestao multilinguee (7 idiomas)

**Scope Contracts:** Contratos e assinaturas

## Objetivos, Contexto, Desafios e Riscos

_Visao estrategica e restricoes_

### Context

O projeto opera dentro de um ecossistema complexo de **15+ subprojetos interconectados** (sourcing front, export, flux/auto-update, API, traducao, estatisticas, MyEasyWeb, etc.). O banco de dados MySQL compartilhado pesa aproximadamente **15 GB** (nao comprimido) distribuido em **97 tabelas**, e e acessado por todas as aplicacoes.

A infraestrutura e hospedada em **servidores dedicados OVH** (sql1, sql2 para MySQL, servidores web dedicados). O versionamento migrou de **SVN** para **GitHub** (organizacao medialeads) **em janeiro de 2016**. Ambientes de desenvolvimento sao provisionados via **Vagrant + Chef** com 25+ cookbooks.

### Stake Catalog

Milhões de produtos com suas variações em 7 idiomas, **32+ campos por ficha produto/variante**, **36 campos por opção de marcação**, **até 50+ grades tarifárias degressivas por produto**, **32 moedas** gerenciadas (taxas BCE). Alguns fornecedores como a **SOL's** mantinham ate **15.000 variações para um único produto** (por exemplo uma camiseta declinada por tamanho, cor, gola V ou redonda, com ou sem mangas, acabamentos, etc.). Uma complexidade de PIM / modelo de dados que era o estado da arte da época para este tipo de catálogo B2B - um nível de modelagem que as soluções PIM do mercado só começaram a se aproximar anos depois.

### Stake Relations

Acompanhamento de assinaturas de fornecedores, contratos, pedidos de servicos publicitarios gerando receita

### Stake Multi Site

Dados alimentando europeansourcing.com, tendanceobjet.com, site de exportacao, 50+ sites MyEasyWeb de revendedores

- Fornecer uma ferramenta de administracao unificada para gerenciar um catalogo de centenas de milhares de produtos de centenas de fornecedores europeus
- Reescrever o extranet com um framework moderno (Symfony 3) para melhorar manutenibilidade, testabilidade e reutilizacao de codigo via bundles compartilhados
- Migrar de MySQL para PostgreSQL e introduzir mensageria assincrona com RabbitMQ
- Oferecer aos fornecedores uma interface autonoma e moderna (SPA AngularJS) para gerenciar sua presenca na plataforma

**Objectives:** Objetivos

**Context:** Contexto

**Stakes:** Desafios

**Stake Catalog:** Catalogo massivo

**Stake Relations:** Relacoes comerciais B2B

**Stake Multi Site:** Ecossistema multi-sites

**Risks:** Riscos identificados

**Risk1 Title:** Complexidade da migracao v1 para v2

**Risk1 Desc:** Reescrita completa de uma ferramenta em producao usada diariamente, com risco de regressao funcional e coexistencia prolongada das duas versoes.

**Risk2 Title:** Banco de dados monolitico

**Risk2 Desc:** Um único banco MySQL compartilhado entre 15+ subprojetos - um pattern arquitetural alinhado com as práticas do final dos anos 2000, que se tornou um desafio estrutural com o crescimento da plataforma.

**Risk3 Title:** Divida tecnica v1

**Risk3 Desc:** Framework MVC próprio refletindo o estado da arte do PHP do período 2008-2010 (antes da generalização do Symfony 2 e dos ORMs modernos) - cada vez mais exigente para evoluir com o crescimento do ecossistema.

## As etapas - O que eu fiz

_Fases cronologicas e contribuicoes pessoais_

- Fase 1 - Extranet v1
- Fase 2 - Rebirth (Symfony 3)
- Fase 3 - Supplier Back-Office

**Phase1 Period:** 2011 - 2016

**Phase2 Period:** 2016 - 2019

**Phase3 Period:** 2014 - 2016

## Os atores - As interacoes

_Equipe e partes interessadas_

**Content:** **Equipe de desenvolvimento (4 desenvolvedores ativos)**
A equipe principal consistia de 4 desenvolvedores com areas de expertise distintas. Contribui com **629 merge requests** e **117.916 linhas de codigo aplicativo**, sendo o autor principal da v1 e do Supplier BO. Thomas C. foi o desenvolvedor principal do v2 Rebirth. IronXtreme contribuiu para o v2 Rebirth, e Wamania focou em refatoracao e correcoes.

**Partes interessadas externas**
- **SQLI**: consultoria externa (Fase 1, 2008-2013) onde redigi 47+ documentos de especificacoes detalhadas para o modulo extranet de fornecedores (ESV3) - cobrindo especificacoes funcionais, especificacoes tecnicas, guias de exploracao e instalacao, modelo de dados e rastreabilidade de requisitos
- **Systonic**: antigo provedor de hospedagem (2009-2010), antes de migrarmos toda a infraestrutura para OVH
- **OVH**: fornecedor principal de servidores dedicados - nós mesmos realizávamos toda a administração de sistemas (provisionamento, configuração, hardening de segurança, monitoramento, backups)
- **Fornecedores**: centenas de empresas europeias de produtos promocionais - os clientes B2B
- **Revendedores**: 50+ distribuidores usando sites MyEasyWeb alimentados pelos dados do extranet

## Resultados

_Impacto para mim e para a organizacao_

### For Me

Este projeto foi uma experiencia fundamental na minha carreira como engenheiro de software. Ao longo de **quase 5 anos de envolvimento**, desenvolvi **expertise profunda em toda a stack**: **desenvolvimento backend PHP** (framework custom depois Symfony), **bancos de dados relacionais** (MySQL e PostgreSQL), **desenvolvimento frontend SPA** (AngularJS) e **praticas DevOps** (administracao de servidores, provisionamento Vagrant/Chef, workflow Git).

**Um projeto de dimensão XXL, excepcional em todos os níveis**: o Extranet era o cérebro de orquestração de todo um ecossistema - **9,1 M de linhas de código no total**, **7.510+ arquivos PHP**, **4.510+ arquivos JavaScript**, **910+ controllers**, **2.220+ views/templates**, e um motor de busca indexando **22.000+ palavras** derivado deste Extranet. Isto tornou o projeto extremamente formativo sobre **manipulação de dados**, **arquitetura de dados**, **complexidade das regras de negócio**, **gestão de infraestrutura e servidores**, e **estratégias de backup de dados em larga escala** - me ensinou a pensar em **performance, escalabilidade e integridade de dados** em um nível impossível de alcançar em projetos menores.

**Motores de busca e indexação**: transição progressiva da indexação nativa em banco (MySQL full-text MyISAM/InnoDB, depois busca full-text PostgreSQL com `tsvector`/`tsquery`, índices GIN e funções `to_tsvector`/`ts_rank`) para um verdadeiro motor de busca com **Elasticsearch** - inverted index, analyzers multilíngues (stemming, tokenization, normalização), scoring TF-IDF, agregações, facetas. Aprendizado das diferenças profundas entre um motor relacional e um motor de busca.

**Algoritmos e regras de negócio complexas**: concepção e implementação de muitos algoritmos e regras de negócio muito complexas - por exemplo o cálculo de todas as combinações possíveis de preços, variantes de produto e disponibilidade (**produto cartesiano / explosão combinatória** que pode gerar **milhares de combinações por produto** entre tamanhos, cores, quantidades, tipos de marcação, zonas de marcação e acabamentos). Domínio da **modelagem de regras de pricing dinâmicas** e de **motores de decisão de negócio**.

### For Company

O extranet era o **coracao operacional** da European Sourcing. Sem esta ferramenta, seria impossivel gerenciar o catalogo de centenas de milhares de produtos, as relacoes com fornecedores e os servicos publicitarios que geravam a receita da plataforma.

- **Gestao do catalogo**: centenas de milhares de produtos gerenciados em 7 idiomas com atributos, variantes, marcacoes e precos
- **Busca multilingue**: **7 indices Elasticsearch dedicados** (um por idioma) impulsionando a busca full-text sobre todo o catalogo de produtos da plataforma
- **Rede de fornecedores**: **800+ fornecedores europeus** gerenciados com assinaturas, contratos e portal self-service dedicado
- **Distribuicao multi-sites**: dados alimentando europeansourcing.com, tendanceobjet.com, site de exportacao, graphicsourcing, 50+ sites MyEasyWeb de revendedores
- **Geracao de receita**: servicos publicitarios (banners, AdWords, sliders, posicionamentos de parceiros) gerenciados inteiramente via extranet
- **Eficiencia operacional**: equipe interna de 5-10 pessoas gerenciando todo o mercado europeu de produtos promocionais via ferramenta unificada

**For Me:** Resultados para mim: Crescimento profissional

**For Company:** Resultados para a organizacao: Impacto no negocio

## O dia seguinte do projeto

_O que aconteceu depois_

**Content:** **Apos a entrega**
A v1 e a v2 coexistiram em producao por varios anos, com a v1 continuando a lidar com as operacoes diarias enquanto o v2 Rebirth era desenvolvido modulo por modulo. **A v2 ainda esta em producao hoje** e continua impulsionando a plataforma European Sourcing.

**Impacto na carreira**
Esta experiencia na European Sourcing - dentro da Medialeads, sua divisao de desenvolvimento de TI e consultoria de TI - **foi fundamental na minha abordagem ao desenvolvimento web em larga escala**. As licoes aprendidas sobre **gestao de modelos de dados complexos**, **construcao de arquiteturas multi-tenant** e **trabalho com conjuntos de dados massivos** influenciaram diretamente meu trabalho posterior em projetos ainda mais ambiciosos.

## Meu olhar critico

_Analise retrospectiva honesta_

### What Worked

- **Escopo funcional extremamente rico**: o extranet cobre todas as necessidades de administracao de uma plataforma B2B complexa - catalogo, fornecedores, revendedores, publicidade, estatisticas, importacao/exportacao, multilinguee
- **Arquitetura modular (v2)**: a criacao de bundles compartilhados (ESCoreBundle, ESSourcingBundle) para compartilhar codigo entre subprojetos foi uma escolha arquitetural pertinente
- **Migracao tecnologica corajosa**: migrar de um framework proprio para Symfony 3 e de MySQL para PostgreSQL mostra vontade de modernizacao
- **Provisionamento automatizado**: o uso de Vagrant + Chef para o v2 garante ambientes de desenvolvimento reprodutiveis

### What Would Change

- **Implementar CI/CD desde o inicio**: GitHub Actions nao existia ainda, mas Travis CI ou Jenkins estavam disponiveis
- **Separar o banco de dados**: em microsservicos ou pelo menos em schemas distintos para reduzir o acoplamento forte entre 15+ subprojetos
- **Adotar Docker em vez de Vagrant + Chef**: para provisionamento mais leve e portavel

### Lessons

- **Bundles compartilhados sao um investimento a longo prazo**: compartilhar codigo de negocio reduz duplicacao mas cria dependencias fortes e requer boa gestao de versoes
- **Importacao de dados e um problema completo de engenharia**: o sistema de importacao CSV em 6 etapas demonstra a complexidade da gestao de dados em massa
- **Documentar a arquitetura e essencial**: quando o numero de subprojetos e desenvolvedores cresce, a documentacao se torna critica

**What Worked:** O que funcionou bem

**What Would Change:** O que eu faria diferente

**Lessons:** Licoes duradouras
