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

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.

2011 - 2016
~6 anos
Software Engineer depois Senior Software Engineer
European Sourcing Group
PHP 5.xSymfony 3.1MySQLPostgreSQLDoctrine ORMRabbitMQAngularJSNode.jsjQueryBootstrap 3d3.jsApacheVagrantChefGitPHPUnit

Linhas de codigo

229.090

Codigo aplicativo (PHP, JS)

Merge Requests

629

4 contribuidores ativos

Banco de dados

38+

Idiomas

7

FR, EN, DE, ES, IT, NL, PT

Apresentacao

Definicao e escopo do projeto

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.

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)

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
Arquitetura global do ecossistema

Objetivos, Contexto, Desafios e Riscos

Visao estrategica e restricoes

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

Riscos identificados

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.

As etapas - O que eu fiz

Fases cronologicas e contribuicoes pessoais

Fase 1 - Extranet v1
Extranet v1 - Custom PHP MVC
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)
Extranet v2 - Symfony 3.1 + PostgreSQL
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
Supplier BO - AngularJS SPA
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

Processo de importacao CSV em 6 etapas
Comparacao arquitetural v1 vs v2

Extranet v1

Extranet v2 Rebirth

Os atores - As interacoes

Com quem interagi diretamente e como colaborei

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.

  • 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
Distribuicao de contribuicoes - Codigo aplicativo (229.090 linhas)

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

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

Trajetória relacionada

Experiência profissional ligada a está realização

Competências aplicadas

Competências técnicas e humanas aplicadas

Galeria de imagens

Capturas e visuais do projeto

Voce 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