---
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.net/pt/realizacoes/extranet-pim-b2b-objets-publicitaires"
source: "https://portfolio.josedacosta.net/pt/realizacoes/extranet-pim-b2b-objets-publicitaires.md"
html_source: "https://portfolio.josedacosta.net/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-06-02T15:37:34.576Z"
---

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

**Data:** 2011 - 2016  
**Duração:** ~6 anos  
**Função:** Software Engineer depois Senior Software Engineer  
**Tecnologias:** PHP 5.x, Symfony 3.1, MySQL, PostgreSQL, Doctrine ORM, RabbitMQ, AngularJS, Node.js, jQuery, Bootstrap 3, Vagrant, Chef

### Indicadores-chave

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

### Dominio

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

### Usuarios-alvo

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

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.

### Escopo funcional

### Gestao do catalogo de produtos

### Gestao de fornecedores e CRM

### Revendedores e sites MyEasyWeb

### Servicos de publicidade

### Importacao/Exportacao CSV (6 etapas)

### Estatisticas e relatorios

### Gestao multilinguee (7 idiomas)

### Contratos e assinaturas

## Objetivos, Contexto, Desafios e Riscos

_Visao estrategica e restricoes_

### Contexto

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.

### Catalogo massivo

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.

### Relacoes comerciais B2B

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

### Ecossistema multi-sites

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

### Complexidade da migracao v1 para v2

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

### Banco de dados monolitico

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.

### Divida tecnica v1

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.

### Objetivos

- 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

### Desafios

### Riscos identificados

## As etapas - O que eu fiz

_Fases cronologicas e contribuicoes pessoais_

### Cronologia do projeto

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

- Desenvolvi o extranet original em um framework PHP MVC proprio
- No lado da ingestao de dados, construi um sistema de importacao CSV em 6 etapas: upload, mapeamento de colunas, validacao, pre-visualizacao, insercao, historico com rollback
- Para alimentar o catalogo continuamente, construi e mantive **37 conectores de importacao automatizados distintos** (FTP, HTTP, APIs REST - incluindo Pixika, Makito, Midocean, BIC, Paul Stricker, Clipper, TopTex, Cybernecard, etc.)
- No catalogo de produtos, implementei a gestao completa: atributos, variantes, marcacoes, traducoes multilinguees
- No CRM, criei a gestao de fornecedores, de revendedores, alem da criacao e do backup de sites MyEasyWeb
- No lado publicitario, desenvolvi os servicos: banners, campanhas AdWords, sliders da homepage, gestao de parceiros
- Para habilitar a pilotagem, construi um modulo completo de estatisticas: por fornecedor, produto, revendedor, MyEasyWeb, publicidades

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

- Participei da reescrita Symfony 3.1 (iniciada em 14 de marco de 2016) com PostgreSQL, Doctrine ORM e RabbitMQ para mensageria assincrona
- No lado da mutualizacao, trabalhei nos bundles de negocio compartilhados: ESCoreBundle (entidades, auth, sistema de arquivos) e ESSourcingBundle (logica de negocio)
- Para industrializar as telas de administracao, implementei um sistema de listas genericas (EntityList) com colunas configuraveis, acoes em massa, acoes por linha e paginacao
- No lado dos formularios, desenvolvi 70+ Form Types Symfony cobrindo produtos, variantes, imagens de produto, marcacoes (estaticas/dinamicas com perfis), atributos (simples/multiplos/grupos), categorias, palavras-chave, etiquetas com sinonimos, assinaturas e fluxos de importacao/exportacao
- Para garantir a reescrita, implementei uma suite de testes PHPUnit completa com 611 arquivos de teste validando entidades, controladores e logica de negocio
- No lado do DevOps, configurei o provisionamento Vagrant + Chef com 25+ cookbooks para ambientes de desenvolvimento reprodutiveis

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

- Construi a SPA de fornecedores em AngularJS e CoffeeScript (19.007 linhas)
- No lado funcional, implementei os modulos: Dashboard, Perfil, Contatos, Produtos, Noticias, Estatisticas, Contratos
- No lado do i18n, entreguei uma interface multilinguee suportando 7 idiomas (FR, EN, DE, ES, IT, NL, PT)
- Para conectar a SPA ao ecossistema, a integrei com a API REST European Sourcing para todas as operacoes de fornecedor

## Os atores - As interacoes

_Com quem interagi diretamente e como colaborei_

### Distribuicao de contribuicoes - Codigo aplicativo (229.090 linhas)

**Equipe de desenvolvimento - meus colegas no dia a dia (4 desenvolvedores ativos)**
Dentro desta equipe enxuta, contribui com **629 merge requests** e **117.916 linhas de codigo aplicativo** - fui o autor principal da v1 e do Supplier BO. Ao meu lado, Thomas C. assumiu o papel de desenvolvedor principal no v2 Rebirth; IronXtreme trouxe reforco pontual no v2 Rebirth, e Wamania focou em refatoracao e correcoes.

**Partes interessadas externas com quem interagi**
- **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); depois conduzi com a equipe a migracao de toda a infraestrutura para a OVH
- **OVH**: provedor principal de servidores dedicados - nos mesmos realizavamos toda a administracao de sistemas (provisionamento, configuracao, hardening de seguranca, monitoramento, backups), e eu participava ativamente desse trabalho
- **Fornecedores**: centenas de empresas europeias de produtos promocionais, clientes B2B para os quais eu era o contato tecnico atraves do extranet
- **Revendedores**: 50+ distribuidores usando sites MyEasyWeb que eu alimentava a partir do extranet

## Resultados

_Impacto para mim e para a organizacao_

### Resultados para mim: Crescimento profissional

Este projeto foi para mim 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 dimensao XXL, excepcional em todos os niveis**: o Extranet era o cerebro de orquestracao de todo um ecossistema - **9,1 M de linhas de codigo 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. Este projeto mudou minha forma de trabalhar: aprendi a pensar em **performance, escalabilidade e integridade de dados** em um nivel impossivel de alcancar em projetos menores, ao me confrontar diariamente com **manipulacao de dados**, **arquitetura de dados**, **complexidade das regras de negocio**, **gestao de infraestrutura e servidores** e **estrategias de backup de dados em larga escala**.

**Motores de busca e indexacao**: passei progressivamente da indexacao nativa em banco (MySQL full-text MyISAM/InnoDB, depois busca full-text PostgreSQL com `tsvector`/`tsquery`, indices GIN e funcoes `to_tsvector`/`ts_rank`) para um verdadeiro motor de busca com **Elasticsearch** - inverted index, analyzers multilingues (stemming, tokenization, normalizacao), scoring TF-IDF, agregacoes, facetas. Essa travessia me permitiu captar em profundidade as diferencas entre um motor relacional e um motor de busca.

**Algoritmos e regras de negocio complexas**: concebi e implementei muitos algoritmos e regras de negocio muito complexas - por exemplo o calculo de todas as combinacoes possiveis de precos, variantes de produto e disponibilidade (**produto cartesiano / explosao combinatoria** que pode gerar **milhares de combinacoes por produto** entre tamanhos, cores, quantidades, tipos de marcacao, zonas de marcacao e acabamentos). A **modelagem de regras de pricing dinamicas** e os **motores de decisao de negocio** agora fazem parte da minha caixa de ferramentas.

### Resultados para a organizacao: Impacto no negocio

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

### Metricas tecnicas

## O dia seguinte do projeto

_O que aconteceu depois_

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

_Com o recuo, como julgo este projeto_

### O que funcionou bem

- **Escopo funcional extremamente rico**: com o recuo, mensuro o quanto o extranet cobre todas as necessidades de administracao de uma plataforma B2B complexa - catalogo, fornecedores, revendedores, publicidade, estatisticas, importacao/exportacao, multilinguee
- **Arquitetura modular (v2)**: reivindico a criacao dos bundles compartilhados (ESCoreBundle, ESSourcingBundle) para mutualizar codigo entre subprojetos - uma escolha que resistiu ao tempo
- **Migracao tecnologica corajosa**: migrar de um framework proprio para Symfony 3 e de MySQL para PostgreSQL exigiu coragem, e eu faria de novo
- **Provisionamento automatizado**: ao levar Vagrant + Chef para o v2, garanti a reprodutibilidade dos ambientes de desenvolvimento

### O que eu faria diferente

- **Implementar CI/CD desde o inicio**: eu teria montado um pipeline com Travis CI ou Jenkins desde o primeiro dia (o GitHub Actions ainda nao existia) e isso teria detectado regressoes mais cedo
- **Separar o banco de dados**: eu teria dividido o banco monolitico em microsservicos ou ao menos em schemas distintos para reduzir o acoplamento forte entre 15+ subprojetos
- **Adotar Docker em vez de Vagrant + Chef**: eu teria migrado mais cedo para Docker, para provisionamento mais leve e portavel

### Os ensinamentos duradouros que este projeto me trouxe

- **Bundles compartilhados sao um investimento a longo prazo**: vi como mutualizar codigo de negocio entre subprojetos reduz duplicacao mas cria dependencias fortes e exige boa gestao de versoes
- **A importacao de dados e um problema completo de engenharia**: apos entregar o sistema de importacao CSV em 6 etapas, agora trato a gestao de dados em massa como uma disciplina completa
- **Documentar a arquitetura e essencial**: vivi que quando o numero de subprojetos e desenvolvedores cresce, a documentacao se torna critica - aplico isso sistematicamente agora

## Competências aplicadas

_Competências técnicas e humanas aplicadas_

- **[Resolucao de Problemas & Adaptabilidade](https://portfolio.josedacosta.net/pt/habilidades/resolucao-de-problemas-adaptabilidade.md)** - Modelagem de regras de negócio complexas (pricing dinâmico, variantes de marcação, multi-moedas) - alguns fornecedores atingindo 15.000 variações por produto. Retomada do projeto da SQLI em 2014, depois liderança da reescrita do MVC custom para Symfony 3.1 + PostgreSQL + RabbitMQ
- **[Arquitetura de Software & Sistemas](https://portfolio.josedacosta.net/pt/habilidades/arquitetura-de-software-sistemas.md)** - Modelo PIM/dados mais complexo que Akeneo: 32+ campos/variante, 36 por marcação, 50+ grades tarifárias, 97 tabelas MySQL, 15 GB, API REST European Sourcing consumida pelo Supplier BO SPA e serviços downstream em 7 idiomas - Bundles Symfony compartilhados (ESCoreBundle, ESSourcingBundle), 70+ Form Types, EntityList genérico, MVC + SPA + ETL
- **[Desenvolvimento Fullstack](https://portfolio.josedacosta.net/pt/habilidades/desenvolvimento-fullstack.md)** - PHP MVC custom depois Symfony 3.1, Doctrine ORM, RabbitMQ async, MySQL depois PostgreSQL ao longo de 5+ anos - 229K linhas no Extranet v1, v2 Rebirth e Supplier BO (SPA AngularJS) - ownership full-stack
- **[DevOps, Cloud & Industrializacao de Produção](https://portfolio.josedacosta.net/pt/habilidades/devops-cloud-industrializacao-de-producao.md)** - Suite de testes PHPUnit com 611 arquivos validando entidades, controllers e lógica de negócio no v2 Rebirth, Servidores dedicados OVH auto-administrados: provisionamento Vagrant + Chef, 25+ cookbooks, Apache, segurança, monitoramento, backups
- **[Dados, IA & Machine Learning](https://portfolio.josedacosta.net/pt/habilidades/dados-ia-machine-learning.md)** - MySQL depois PostgreSQL com Doctrine, pipeline de import CSV em 6 etapas, 37 conectores de fornecedores FTP/HTTP/REST
- **[Engenharia Reversa & Algoritmos](https://portfolio.josedacosta.net/pt/habilidades/engenharia-reversa-algoritmos.md)** - Motor de pricing combinatório: milhares de combinações por produto (tamanhos × cores × marcações × zonas × acabamentos)

## Trajetória relacionada

_Experiência profissional ligada a está realização_

- **Software Engineer · desenvolvedor PHP Zend Framework**

## Galeria de imagens

_Capturas e visuais do projeto_

## Você tem um extranet de parceiros para projetar ?

Entreguei o extranet European Sourcing: gestao detalhada de acessos de parceiros, area de documentos contratuais e acompanhamento de pedidos. Vamos conversar sobre seu contexto.

**Entrar em contato**
