---
title: "Mecanismo de Busca Europeu B2B de Produtos Promocionais (European Sourcing)"
description: "Mecanismo de busca B2B que funciona como feira online para revendedores europeus de produtos promocionais - um precursor das marketplaces atuais."
locale: "pt"
canonical: "https://portfolio.josedacosta.info/pt/realizacoes/moteur-de-recherche-europeen-b2b-objets-publicitaires"
source: "https://portfolio.josedacosta.info/pt/realizacoes/moteur-de-recherche-europeen-b2b-objets-publicitaires.md"
html_source: "https://portfolio.josedacosta.info/pt/realizacoes/moteur-de-recherche-europeen-b2b-objets-publicitaires"
author: "José DA COSTA"
date: "2010"
type: "achievement"
slug: "moteur-de-recherche-europeen-b2b-objets-publicitaires"
tags: ["PHP 5.x", "Symfony 2/3", "MySQL", "Elasticsearch", "AngularJS", "Propel/Doctrine ORM", "Memcache", "RabbitMQ", "Apache", "Proxmox VE", "AWS SES", "PhoneGap/Cordova"]
generated_at: "2026-04-23T15:47:53.767Z"
---

# Mecanismo de Busca Europeu B2B de Produtos Promocionais (European Sourcing)

Mecanismo de busca B2B que funciona como feira online para revendedores europeus de produtos promocionais - um precursor das marketplaces atuais.

**Date:** 2010 - 2016  
**Duration:** ~6 anos  
**Role:** Software Engineer depois Senior Software Engineer  
**Technologies:** PHP 5.x, Symfony 2/3, MySQL, Elasticsearch, AngularJS, Propel/Doctrine ORM, Memcache, RabbitMQ, Apache, Proxmox VE, AWS SES, PhoneGap/Cordova

### Key Metrics

- Linhas de codigo: **-** - PHP, JS, Twig, CSS, HTML
- Tabelas no banco: **-** - MySQL (master-slave)
- Sub-aplicacoes: **-** - Ecossistema de microsservicos
- Idiomas suportados: **-** - FR, EN, DE, ES, IT, NL, PT
- Servidores dedicados: **-** - OVH Proxmox VE
- Conectores de fornecedores: **-** - Importacao automatizada de dados
- Entradas de versionamento: **-** - 836 Git + 398 SVN
- Sites revendedores: **-** - CMS hospedado MyEasyWeb

## Apresentacao e definicao do projeto

_Quinze sub-aplicacoes interconectadas, quatro geracoes de mecanismos de busca, 8 anos de desenvolvimento_

### Domain

Comunicacao por objeto B2B - conectando fornecedores, revendedores e agencias europeias na industria de produtos promocionais.

### Target Users

Profissionais B2B em toda a Europa - agencias de comunicacao, distribuidores, e exemplos de fornecedores europeus integrados (Midocean, PF Concept, BIC, Paul Stricker, SOL'S, TopTex, Topico, Inspirion, Makito, Xindao, Clipper, Cybernecard, Pixika, Delta, Passot, Lm, Boomerang, Axpol, Goya, GetImpressed, Giving, Lensen Toppoint, Cottel, Eljte, Frezal, Imbretex).

**Content:** European Sourcing e um **mecanismo de busca B2B de produtos promocionais** que funciona como feira profissional permanente online em escala europeia - um **precursor do que hoje chamamos de marketplaces**, destinado a todos os revendedores europeus de produtos promocionais. O projeto constitui um **ecossistema completo de aplicacoes** composto por quinze sub-aplicacoes interconectadas, desenvolvidas ao longo de mais de 6 anos (2010-2017).

A plataforma conecta tres tipos de atores no mercado de produtos promocionais:
- **Fornecedores** (fabricantes/atacadistas) que listam seus catalogos de produtos → **B2B**
- **Revendedores/Distribuidores** (agencias de comunicacao) que buscam produtos para seus clientes → **B2B**
- **Visitantes** que navegam pelo catalogo online nos sites dos revendedores (clientes finais) → **B2C**

O sistema funciona como uma **feira profissional permanente online**, oferecendo aos fornecedores uma vitrine multicanal (catalogo online, newsletters, banners publicitarios, guidebook anual, Google Ads) e aos revendedores um motor de busca de produtos multilingue cobrindo 7 idiomas europeus.

**Domain:** Dominio de negocios

**Target Users:** Usuarios-alvo

**Functional Scope:** Escopo funcional

**Scope Catalog:** Catalogo de produtos multilingue (7 idiomas)

**Scope Search:** Busca full-text (Elasticsearch)

**Scope Extranet:** Back-office fornecedores/revendedores

**Scope Flux:** Importacao automatizada de dados (26+ conectores)

**Scope Api:** API REST com autenticacao WSSE

**Scope Translate:** Sistema de traducao centralizado

**Scope Payment:** Pagamento online (Sogenactif)

**Scope Mew:** CMS mini-sites revendedores (MyEasyWeb)

**Scope Mobile:** Aplicacoes moveis (PhoneGap/Cordova)

**Scope Stats:** Estatisticas de consulta (visualizacoes, buscas, cliques)

**Scope Export:** Exportacao de dados (CSV + imagens de produtos)

**Scope Seo:** Back-office SEO / Marketing

## Objetivos, contexto, desafios e riscos

_Digitalizando o mercado europeu de produtos promocionais_

### Context

O projeto inicial (v1/v2) foi desenvolvido pela **SQLI**, uma empresa francesa de servicos de TI, com um framework PHP customizado e templates Smarty. O codigo legado continha 398 revisoes SVN cobrindo 2010-2013.

Quando cheguei na SQLI, **5 desenvolvedores PHP dedicados em tempo integral** trabalhavam no projeto. Com o tempo, assumi uma parte crescente do perimetro tecnico, ate cobrir sozinho **o essencial das evolucoes** - um papel que evoluiu naturalmente com minha expertise crescente e a autonomia do ambiente PME. Depois de cuidar sozinho do perimetro por um tempo, pedi reforco e obtive a contratacao de um segundo desenvolvedor.

A partir de 2014-2016, **nossa nova equipe Medialeads** realizou uma **reescrita completa** da plataforma, migrando progressivamente do framework customizado para **Symfony 2/3** enquanto mantinha o site publico em um framework MVC customizado mais leve.

A plataforma era **multilingue** (7 idiomas), **multi-pais**, com alto volume de dados de produtos, e a necessidade de manter compatibilidade com os feeds de dados de fornecedores existentes - **tudo hospedado em servidores dedicados OVH totalmente autogerenciados: faziamos absolutamente tudo por conta propria, da configuracao do sistema ate as implantacoes**.

### Stake Business

Receita de assinaturas de fornecedores (240-288 EUR/ano) e servicos publicitarios (banners, newsletters, guidebook, Google Ads, planejamento de midia).

### Stake Position

European Sourcing se posicionava como a referencia do sourcing de produtos promocionais online na Europa - um precursor das marketplaces B2B atuais, substituindo catalogos impressos e feiras fisicas tradicionais.

### Stake Ecosystem

A empresa tambem operava TendanceObjet.com, Kadobjet.fr, FranceObjet.com, Omyague.com, GourmetOnline.pro, Recherche-Publicitaire.com, GraphicSourcing.com, CPrint-Sourcing.com, WineSpiritSourcing.com, Tradexpo-Online.fr - cada marca visando um segmento especifico do mercado.

- Posicionar a plataforma como **a referencia europeia** do sourcing B2B de produtos promocionais online, substituindo catalogos impressos e feiras fisicas
- Construir um **catalogo de produtos multilingue** agregando **varios milhoes de produtos e variantes** provenientes de dezenas de fornecedores
- Fornecer aos revendedores um **motor de busca avancado** com filtros por categoria, marca, preco, atributos, marcacao
- Automatizar a **importacao de feeds de dados** de fornecedores (precos, estoques, imagens, descricoes) de 26+ fornecedores
- Oferecer aos revendedores uma solucao **pronta de mini-sites e-commerce** (MyEasyWeb) com sua propria vitrine brandada conectada ao catalogo central
- Gerar **estatisticas de consulta** detalhadas para fornecedores (visualizacoes de produtos, buscas, cliques)

**Objectives:** Objetivos

**Context:** Contexto

**Stakes:** Desafios

**Stake Business:** Modelo de negocios

**Stake Position:** Posicao estrategica

**Stake Ecosystem:** Ecossistema de marcas

**Risks:** Riscos identificados

**Risk1 Title:** Divida tecnica

**Risk1 Desc:** Migracao progressiva de um framework customizado para Symfony, coexistencia de duas arquiteturas (SVN legado + Git moderno), hash MD5 de senhas com uma unica iteracao e sem salt - coerente com o estado da arte das praticas de seguranca PHP da decada 2008-2014, antes de bcrypt se tornar o padrao.

**Risk2 Title:** Complexidade de integracao

**Risk2 Desc:** Os feeds de dados de fornecedores eram heterogeneos (CSV, XML, API), exigindo um adaptador especifico por fornecedor, todos mantidos em flux.europeansourcing.com.

**Risk3 Title:** Dependencia de infraestrutura

**Risk3 Desc:** 9 servidores dedicados OVH com virtualizacao Proxmox, replicacao MySQL master/slave, implantacoes manuais via svn up - reflexo das restricoes tecnicas da epoca, antes da democratizacao do Docker e dos pipelines CI/CD modernos.

**Risk4 Title:** Bus factor

**Risk4 Desc:** Apenas 3 desenvolvedores principais para todo o ecossistema de 38 sub-projetos e 9 servidores.

## As etapas - O que eu fiz

_Do monolito SQLI a arquitetura de microsservicos distribuida_

**Phase1 Name:** Fase 1

**Phase1 Title:** Desenvolvimento SQLI e legado SVN (2008-2013)

**Phase1 Period:** 2008 - 2013

**Phase2 Name:** Fase 2

**Phase2 Title:** Retomada interna e microsservicos (2014-2016)

**Phase2 Period:** Jan 2016 - Dez 2016

**Phase3 Name:** Fase 3

**Phase3 Title:** Modernizacao arquitetural (2016-2017)

**Phase3 Period:** Mar 2016 - Nov 2016

## Os atores - As interacoes

_Colaboracao em uma equipe reduzida mas altamente produtiva_

### Equipe de desenvolvimento

3 a 5 desenvolvedores ativos dependendo do periodo, com responsabilidades claramente divididas:

### Workflow de desenvolvimento

Organizacao GitHub medialeads (Bordeaux), branches por desenvolvedor (jose, fancyweb, wamania), documentacao interna DokuWiki. Nenhum processo formal de Pull Requests foi identificado - a equipe usava merges diretos de branches e areas de codigo atribuidas a cada desenvolvedor.

## Os resultados

_Impacto mensuravel para a empresa e para minha carreira_

### Para mim

- **Gestao massiva de dados e otimizacao SQL**: dominio das **formas normais SQL** (1NF, 2NF, 3NF, BCNF), de todos os **tipos de joins** (INNER/LEFT/RIGHT/CROSS/SELF), da **indexacao avancada** (indices B-tree, compostos, covering), da analise constante de planos de execucao com **`EXPLAIN ANALYZE`**, da **replicacao MySQL master-slave** e do **cache Memcache**. **Batches noturnos de varias horas** para recalcular estoques, precos e promocoes em todo o catalogo - nessa escala, um indice ausente podia transformar uma query de 50 ms em timeout de 30 segundos, entao cada milissegundo ganho por query se multiplicava em milhoes de execucoes.
- **Mecanismos de busca e indexacao**: passagem pratica por **quatro geracoes** de mecanismos - (1) **MySQL LIKE / FULLTEXT** (MyISAM/InnoDB), (2) **busca full-text PostgreSQL** com `tsvector`/`tsquery`, **indices GIN** e funcoes `to_tsvector`/`ts_rank`, (3) **Apache Solr** indexando centenas de milhares de produtos com facetamento avancado (categorias, cores, precos, fornecedores), sugestoes, correcao ortografica e scoring de relevancia personalizado, (4) **Elasticsearch** com inverted indexes, analyzers multilingues (stemming, tokenization, normalizacao), scoring TF-IDF, agregacoes e facetas. Aprendizado das diferencas profundas entre um mecanismo relacional e um mecanismo de busca dedicado.
- **Algoritmos e regras de negocio complexas**: concepcao e implementacao de **numerosos algoritmos** e de **regras de negocio muito complexas** - por exemplo o calculo de todas as combinacoes possiveis de preco, variantes de produto e disponibilidade (**produto cartesiano / explosao combinatoria** gerando milhares de combinacoes por produto entre tamanhos, cores, quantidades, tipos de marcacao, zonas de marcacao e acabamentos). Dominio da modelagem de regras de pricing dinamicas e motores de decisao de negocio.
- Dominio do **ecossistema Symfony 2/3** em producao em larga escala (Propel, Doctrine, bundles, servicos, seguranca, WSSE)
- Desenvolvimento de habilidades solidas em **migracao de codigo legado** - transicao do monolito SVN para microsservicos Git sem interrupcao de servico
- Aquisicao de conhecimento de dominio em **mercado B2B de produtos promocionais**, automacao de feeds de dados e e-commerce multi-pais
- Aprendizado de coordenacao em uma equipe pequena onde cada desenvolvedor possui porcoes significativas do codigo

**Delivered Features:** **Funcionalidades-chave entregues:**
- Catalogo de produtos multilingue com indices Elasticsearch dedicados e scoring de relevancia personalizado
- API REST com autenticacao WSSE stateless (nonce + timestamp + digest)
- Conectores automatizados de importacao lidando com feeds heterogeneos CSV / XML / API
- Back-office fornecedores/revendedores com gestao completa de produtos
- Dashboard de fornecedores SPA (AngularJS 1.2 + CoffeeScript + Grunt + Bower)
- CMS mini-sites revendedores (MyEasyWeb) com vitrines brandadas conectadas ao catalogo central
- Integracao de pagamento online (Sogenactif, Société Générale)
- Back-office SEO / marketing (Zend Framework + ExtJS + crawler web)
- Aplicacoes moveis hibridas (jQuery Mobile + PhoneGap/Cordova)

## O depois do projeto

_O que aconteceu apos minha saida do projeto_

**Content:** **Sai do projeto em novembro de 2016**, deixando uma plataforma em pleno funcionamento. A equipe continuou operando e evoluindo o European Sourcing - **o projeto nao foi interrompido**, ele simplesmente continuou sem mim. A fase final de consolidacao em torno de bundles Symfony compartilhados, que eu havia iniciado, foi levada adiante pela equipe.

Em retrospectiva, as escolhas arquiteturais da Fase 2 se mostraram **solidas e modernas para sua epoca**: a abordagem orientada a servicos com subdominios dedicados, a autenticacao WSSE stateless entre servicos, a arquitetura do mecanismo de busca e a infraestrutura de conectores automatizados de fornecedores permaneceram tecnicamente impressionantes muito depois da minha saida.

## Minha perspectiva critica

_Retrospectiva honesta sobre 8 anos de desenvolvimento_

### Would Do Differently

Com os padroes e o recuo de hoje, algumas escolhas poderiam ter sido diferentes - cada decisao fazia sentido dentro das restricoes da sua epoca:
- **Adotar um unico framework** desde o inicio em vez de manter um framework PHP customizado ao lado do Symfony, embora o contexto historico justificasse a coexistencia durante a migracao.
- **Configurar CI/CD** desde a migracao para GitHub (janeiro 2016) - Jenkins, Travis CI ou GitLab CI estavam disponiveis mesmo que GitHub Actions ainda nao existisse.
- **Usar Docker** para ambientes de dev e implantacao, embora Proxmox fosse o padrao de virtualizacao maduro para PMEs PHP da epoca.
- **Centralizar o acesso a dados** via uma unica API em vez de conectar cada servico diretamente ao banco MySQL - um padrao que so se generalizou apos 2017.

**Strengths:** Pontos fortes

**Improvements:** Areas para melhoria

**Would Do Differently:** O que eu faria diferente

**Lessons:** Licoes duradouras
