Contact
Vamos trabalhar juntos
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
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
  • Desenvolvimento do extranet original com framework PHP MVC proprio

  • Construcao de um sistema de importacao CSV em 6 etapas: upload, mapeamento de colunas, validacao, pre-visualizacao, insercao, historico com rollback

  • Construcao e manutencao de 37 conectores de importacao automatizados distintos (FTP, HTTP, APIs REST - incluindo Pixika, Makito, Midocean, BIC, Paul Stricker, Clipper, TopTex, Cybernecard, etc.)

  • Implementacao da gestao de catalogo de produtos com atributos, variantes, marcacoes, traducoes multilinguees

  • Criacao da gestao de fornecedores (CRM), revendedores, criacao e backup de sites MyEasyWeb

  • Desenvolvimento de servicos publicitarios: banners, campanhas AdWords, sliders da homepage, gestao de parceiros

  • Construcao de modulo completo de estatisticas: por fornecedor, produto, revendedor, MyEasyWeb, publicidades

  • Autor de 97,2% do codigo aplicativo v1 (98.909 linhas de 101.674)

Fase 2 - Rebirth (Symfony 3)
Extranet v2 - Symfony 3.1 + PostgreSQL
2016 - 2019
  • Participacao na reescrita Symfony 3.1 (iniciada em 14 de marco de 2016) com PostgreSQL, Doctrine ORM e RabbitMQ para mensageria assincrona

  • Trabalho com bundles de negocio compartilhados: ESCoreBundle (entidades, auth, sistema de arquivos) e ESSourcingBundle (logica de negocio)

  • Implementacao do sistema de listas genericas (EntityList) com colunas configuraveis, acoes em massa, acoes por linha e paginacao

  • Desenvolvimento de 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

  • Implementacao de uma suite de testes PHPUnit completa com 611 arquivos de teste validando entidades, controladores e logica de negocio

  • Configuracao do provisionamento Vagrant + Chef com 25+ cookbooks para ambientes de desenvolvimento reprodutiveis

Fase 3 - Supplier Back-Office
Supplier BO - AngularJS SPA
2014 - 2016
  • Construcao da SPA de fornecedores em AngularJS e CoffeeScript (19.007 linhas)

  • Implementacao dos modulos: Dashboard, Perfil, Contatos, Produtos, Noticias, Estatisticas, Contratos

  • Criacao de interface multilinguee suportando 7 idiomas (FR, EN, DE, ES, IT, NL, PT)

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

Equipe e partes interessadas

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.

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

Resultados

Impacto para mim e para a organizacao

Resultados para mim: Crescimento profissional

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.

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

Analise retrospectiva honesta

O que funcionou bem
  • 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
O que eu faria diferente
  • 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
Licoes duradouras
  • 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

Trajetoria relacionada

Experiencia profissional ligada a esta realizacao

Competencias aplicadas

Competencias tecnicas e humanas aplicadas

Competências técnicas

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