Contact
Vamos trabalhar juntos
Extranet - Plataforma de Administracao de Catalogo B2B

Extranet - Plataforma de Administracao de Catalogo B2B

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

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

Linhas de codigo

229,090

Codigo aplicativo (PHP, JS)

Commits

629

4 contribuidores ativos

Modelos de dados

38+

Modelos v1 + 74 Form Types v2

Idiomas

5

FR, EN, DE, IT, ES

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 (Medialeads) gerenciar todo o catalogo de produtos, fornecedores, revendedores, servicos de publicidade e estatisticas da plataforma.

O projeto passou por duas versoes principais: o Extranet v1, uma aplicacao PHP personalizada (framework MVC proprio) com MySQL, desenvolvida desde as origens da plataforma e 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) + centenas de fornecedores europeus (via Supplier BO) + 50+ revendedores (via MyEasyWeb)

Escopo funcional
Gestao do catalogo de produtosGestao de fornecedores e CRMRevendedores e sites MyEasyWebServicos de publicidadeImportacao/Exportacao CSV (6 etapas)Estatisticas e relatoriosGestao multilinguee (5 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) 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). Ambientes de desenvolvimento sao provisionados via Vagrant + Chef com 25+ cookbooks.

Catalogo massivo

Centenas de milhares de produtos com traducoes em 5 idiomas, atributos multiplos, marcacoes, variantes e precos

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 unico banco MySQL compartilhado entre 15+ subprojetos criando acoplamento forte e riscos em cascata.

Divida tecnica v1

Framework MVC proprio sem testes, sem ORM, com consultas SQL brutas nos modelos - tornando cada modificacao arriscada.

Autenticacao MD5

Codificacao MD5 legada sem salt (0 iteracoes) para autenticacao - criptograficamente fraca mesmo em 2016.

Modelo entidade-relacionamento simplificado

As etapas - O que eu fiz

Fases cronologicas e contribuicoes pessoais

Cronologia do projeto
Fase 1 - Extranet v1
Extranet v1 - Custom PHP MVC
2011 - 2016
  • Desenvolvimento do extranet original com framework PHP MVC proprio - 28 controllers admin, 8 controllers fornecedor, 38 modelos
  • Construcao de um sistema de importacao CSV em 6 etapas: upload, mapeamento de colunas, validacao, pre-visualizacao, insercao, historico com rollback
  • 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 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 para gestao de entidades complexas (produtos, variantes, marcacoes, importacoes/exportacoes)
  • 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 - autor de 99,1% do codigo (19.007 linhas)
  • Implementacao dos modulos: Dashboard, Perfil, Contatos, Produtos, Noticias, Estatisticas, Contratos
  • Criacao de interface multilinguee suportando 5 idiomas (FR, EN, DE, IT, ES)
  • 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

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 266 commits (42,3%) e 117.916 linhas de codigo aplicativo (51,5%), sendo o autor principal da v1 (97,2%) e do Supplier BO (99,1%). Thomas C. foi o desenvolvedor principal do v2 Rebirth, autor de 95,1% do seu codigo. IronXtreme contribuiu para o v2 Rebirth, e Wamania focou em refatoracao e correcoes.

Equipe interna (Medialeads) 5 outras pessoas identificadas nas configuracoes e acessos de servidor: Jordan e Yves (desenvolvedores), Francois (DevOps/admin de servidor), Yohan (desenvolvedor) e Guillaume (comercial/admin). A colaboracao acontecia via branches Git por desenvolvedor, uma branch prod para producao e um wiki interno DokuWiki para documentacao.

  • SQLI: consultoria externa que redigiu especificacoes detalhadas do modulo extranet de fornecedores (ESV3)
  • Systonic: antigo provedor de hospedagem (2009-2010), antes da migracao para OVH
  • OVH: provedor de hospedagem principal para servidores dedicados
  • 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)
Distribuicao por subprojeto

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

A escala do projeto - centenas de milhares de produtos, bancos de dados de 15 GB, arquitetura multi-sites - me ensinou a pensar em performance, escalabilidade e integridade de dados em um nivel impossivel de alcancar em projetos menores. A construcao do sistema de importacao CSV em 6 etapas com validacao, pre-visualizacao e rollback foi um verdadeiro curso de engenharia de dados.

O desenvolvimento do Supplier BO como SPA autonoma me deu minha primeira experiencia com arquitetura single-page application e design API-first, habilidades que se mostraram essenciais ao longo da minha carreira.

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 5 idiomas com atributos, variantes, marcacoes e precos
  • Rede de fornecedores: centenas de 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
Distribuicao tecnologica

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. Os ultimos backups completos datam de marco e agosto de 2019, incluindo dumps SQL de 15 GB, backups FTP de catalogos de fornecedores e snapshots completos dos servidores.

Evolucao a medio prazo A plataforma European Sourcing continuou operando como a principal feira online europeia de produtos promocionais. As decisoes arquiteturais - bundles compartilhados (ESCoreBundle, ESSourcingBundle), migracao para PostgreSQL, RabbitMQ para processamento assincrono - forneceram uma base para evolucao continua da plataforma.

Estado atual A ultima atividade detectada nos arquivos data de novembro de 2019. O codigo do projeto representa um trabalho significativo: 229.090 linhas de codigo aplicativo em 3 subprojetos, 629 commits de 4 desenvolvedores, alimentando um ecossistema de sites publicos cobrindo o mercado europeu B2B de produtos promocionais.

Impacto na carreira Esta experiencia na European Sourcing/Medialeads 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
  • Separacao de interfaces: o Supplier BO como SPA AngularJS separada oferece uma melhor experiencia do usuario para os fornecedores
O que eu faria diferente
  • Usar um framework padrao desde o inicio: Symfony 2 existia em 2011 e teria trazido beneficios do ecossistema, testes e documentacao
  • 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
  • Usar bcrypt ou argon2: para hash de senhas em vez do MD5 legado sem salt
  • Adotar Docker em vez de Vagrant + Chef: para provisionamento mais leve e portavel
  • Privilegiar migracao incremental: em vez da abordagem "big rewrite" - migrar modulo por modulo teria sido mais pragmatico
Licoes duradouras
  • A reescrita completa e arriscada: a coexistencia da v1 e v2 por varios anos mostra que a migracao e um processo longo e complexo. Uma abordagem incremental teria sido mais pragmatica
  • 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

Galeria de imagens

Capturas e visuais do projeto