Contact
Vamos trabalhar juntos
Sistema de Importacao de Dados de Produtos Multi-Fornecedores

Sistema de Importacao de Dados de Produtos Multi-Fornecedores

Motor de importacao critico do marketplace B2B European Sourcing - 254+ fornecedores, 120+ tabelas no banco, 8 tipos de importacao CSV, 5 idiomas, 7 anos de desenvolvimento (2009-2016).

2009 - 2016
~7 anos
Software Engineer depois Senior Software Engineer
PHP 5.xMySQLSymfony 2.xSmartyjQuery 1.7BootstrapDockerVagrantApacheMemcachedProxySQLPostgreSQLFTPCSVXMLSVNGitDomPDFPHPMailer

Linhas de codigo

131,765

Codigo PHP aplicativo (excl. terceiros)

Fornecedores

254+

254+ pastas de importacao identificadas

Tabelas no banco

120+

120+ tabelas MySQL

Idiomas

5

FR, EN, DE, ES, IT

Apresentacao e definicao

Um motor de importacao centralizado para o mercado europeu de produtos promocionais

O projeto Import European Sourcing constitui o sistema de importacao e gestao de dados de produtos da plataforma European Sourcing, um ator importante do setor de objetos publicitarios e promocionais na Europa. European Sourcing e um marketplace B2B que conecta fornecedores de objetos publicitarios (fabricantes, importadores) com distribuidores/revendedores em toda a Europa.

O sistema ingere e normaliza catalogos de 254+ fornecedores em formatos heterogeneos (CSV, XML, feeds FTP), processa-os atraves de pipelines de validacao e transformacao, e grava em um banco MySQL centralizado que alimenta um motor de busca multilingue em 5 idiomas europeus.

O sistema de importacao evoluiu em duas geracoes principais:

  • Legacy (2007-2016): Aplicacao PHP monolitica construida em um framework MVC customizado (SQLI), com scripts batch para importacao de catalogos e atualizacao automatica via FTP
  • Moderno (2016-2019): Extranet Symfony (v2) introduzindo filas de importacao assincronas, esquemas CSV estruturados para 8 tipos de importacao, e acompanhamento de progresso em tempo real
Dominio de negocio

Objetos publicitarios e promocionais B2B - um setor que conecta fabricantes europeus de produtos de marca (canetas, texteis, acessorios de escritorio, brindes corporativos) com revendedores que personalizam e comercializam.

Escopo funcional

Importacao massiva de catalogos de fornecedores (imagens, dados de produtos, variantes, marcacoes, opcoes tarifarias, estoques), atualizacao automatica via feeds FTP/XML/CSV, gestao de perfis de fornecedores, geracao de catalogos PDF e gestao de assinaturas.

Objetivos, contexto, desafios e riscos

Entendendo os motivadores de negocio por tras do desafio tecnico

Objetivos
  • Centralizar catalogos de 250+ fornecedores europeus em um banco normalizado unico
  • Automatizar atualizacao de dados de produtos (precos, estoques, referencias) via feeds FTP/XML/CSV
  • Fornecer uma extranet multilingue (5 idiomas: FR, EN, DE, ES, IT) para gestao de fornecedores e distribuidores
  • Gerar exportacoes personalizadas em CSV e PDF para distribuidores e equipes comerciais
  • Entregar um motor de busca avancado com busca fonetica, sinonimos e filtragem multi-criterios
Contexto

O projeto foi inicialmente desenvolvido pela SQLI (empresa francesa de servicos de TI) em um framework PHP customizado com SQL Server, depois migrado para MySQL. A arquitetura inicial (por volta de 2007-2010) baseava-se em um padrao MVC customizado com Smarty para templates.

O projeto era de propriedade da Medialeads (empresa por tras do European Sourcing), cuja organizacao GitHub e `github.com/medialeads`. Entre 2016 e 2019, uma versao modernizada da extranet (v2) foi desenvolvida em Symfony com Bootstrap, Docker/Vagrant, e um sistema de importacao assincrono com fila.

A infraestrutura baseava-se em uma arquitetura front/back MySQL com balanceamento de carga: um MySQL front (192.168.0.103) para o site publico e um MySQL back (192.168.0.102) para a extranet de administracao, com sincronizacao por batch.

Desafios de negocio
  • Completude do catalogo: o valor da plataforma depende diretamente do numero e qualidade dos produtos referenciados
  • Frescor dos dados: precos, estoques e disponibilidades mudam frequentemente - atualizacoes automaticas sao criticas
  • Qualidade dos dados: normalizacao multilingue, gestao de duplicatas, correspondencia de referencias fornecedor/interno
  • Performance: com 15 GB de dump SQL e centenas de milhares de produtos, os batchs de importacao devem ser otimizados
  • Receita: assinaturas pagas de fornecedores (240 EUR/ano), mini-sites de distribuidores, publicidade
Riscos identificados

Divida tecnica significativa

Framework PHP customizado sem ORM, queries SQL por concatenacao de strings, funcoes depreciadas (magic_quotes, ereg)

Vulnerabilidades de seguranca

Credenciais em texto claro na configuracao (application.xml), queries SQL nao parametrizadas em scripts batch, senhas FTP hardcoded

Limites de escalabilidade

Batchs de importacao sequenciais com set_time_limit de 1 a 4 horas, sem sistema de fila na versao legacy

Dependencia de fornecedores

Feeds FTP heterogeneos - cada fornecedor tem seu proprio formato CSV/XML, exigindo codigo de parsing especifico por fornecedor

Etapas - O que eu fiz

Uma jornada de 12 anos, da retomada do legacy ate importacoes assincronas modernas

Phase 1
Desenvolvimento inicial e migracao
2007-2010
  • Desenvolvimento da plataforma European Sourcing pela SQLI com banco SQL Server
  • Migracao tabela por tabela de SQL Server para MySQL via modulo ControlAdminImport
  • Recuperacao de dados complexa: paises, cidades, servicos, organizacoes, status, assinaturas, familias, produtos, criterios, sinonimos, distribuidores, contatos, fornecedores, catalogos, paginas, indexacoes
Phase 2
Enriquecimento funcional
2010-2016
  • Adicionado sistema de importacao de catalogos (digitalizacao de paginas, miniaturas, indexacao automatica)
  • Criado sistema de mini-sites para revendedores (Kadobjet e 50+ dominios personalizados)
  • Desenvolvidas exportacoes CSV/PDF, gestao de publicidade, sistema de newsletters, dashboard de estatisticas
  • Expansao para 84 classes VO e 282 templates Smarty em 5 idiomas
Phase 3
Automacao de importacoes (FTP/XML)
2015-2018
  • Construcao do sistema auto_mise_a_jour.php com codigo especifico por fornecedor (MID OCEAN BRANDS x10, PF Concept, Pixika, Delta, Inspirion, Topico...)
  • Automacao de download FTP, parsing XML/CSV, correspondencia de referencias, atualizacao de precos e estoques
  • Gestao de formatos heterogeneos: referencias multi-formato (int/string/multi com colchetes), espacos parasitas, duplicatas
Phase 4
Extranet v2 e importacao moderna
2016-2019
  • Reconstrucao da extranet em Symfony com interface Bootstrap, ambiente Docker/Vagrant
  • Concepcao e implementacao do sistema de importacao assincrono com fila (es_core_import)
  • Documentacao de 8 tipos de importacao CSV com esquemas estruturados (produtos, variantes, marcacoes, tarifas, imagens, perfis de fornecedores)
  • Adicionado acompanhamento de progresso em tempo real, historico de importacoes com timestamps e nome do operador, upload FTP de arquivos CSV
Fluxo de atualizacao automatica FTP/XML
Cronologia do projeto (2007-2019)

Atores e interacoes

Uma equipe multi-geracional de 20+ contribuidores ao longo de 12 anos

20 contribuidores identificados nos arquivos PHP (@author), metadados SVN, logs Git, capturas de tela e arquivos de configuracao.

O projeto evoluiu em duas fases de equipe distintas:

  • Fase SQLI (2007-2010): 3 desenvolvedores principais (jebanquey, bvermeulen, lhuangoc) produziram 79,8% do codigo original
  • Fase Medialeads (2013-2019): Jose DA COSTA assumiu como desenvolvedor principal (99,8% dos commits SVN), depois acompanhado por Thomas C., fancyweb, amandine, bastien para a modernizacao

Atores nao-tecnicos incluem operadores de importacao (Rahnia Sadaoui, Anthony Brifouillere, Paul Meyer), gerentes comerciais, e 250+ fornecedores externos com feeds automatizados.

O desenvolvimento seguia um modelo de entrega incremental (sem metodologia Agile formal identificada), com entregas tematicas organizadas em um diretorio `livraisons/`.

Autoria do codigo original (@author, 155 arquivos PHP)
Contribuicoes SVN (11.868 nos)
Partes interessadas externas
  • Medialeads - empresa mae do European Sourcing
  • SQLI - empresa de servicos de TI que construiu a plataforma inicial
  • Systonic - provedor de hospedagem (2010)
  • OVH - hospedagem de servidores dedicados
  • Sogenactif (Societe Generale) - gateway de pagamento
  • 250+ fornecedores com feeds automatizados (MID OCEAN, PF Concept, Pixika, Delta, Inspirion...)
  • 50+ distribuidores com mini-sites personalizados (Kadobjet, avotrimage.fr, cadonor.fr, prodiges.com...)

Resultados

Impacto para mim e para a empresa

Para mim
  • Dominio da engenharia de importacao de dados em larga escala com formatos heterogeneos multi-fornecedores
  • Expertise aprofundada em arquitetura MySQL (separacao leitura/escrita, replicacao, desnormalizacao)
  • Aprendizado na gestao de um projeto ao longo de 12 anos, equilibrando manutencao legacy e modernizacao
  • Desenvolvimento de competencias em batch processing (PHP CLI, agendamento cron, automacao FTP)
  • Transicao de um codebase SQLI herdado para o design independente da arquitetura Symfony v2
Para a empresa
  • European Sourcing tornou-se um ator de referencia no mercado europeu de produtos promocionais
  • Cobertura multi-pais (FR, UK, DE, ES, IT) com 250+ fornecedores referenciados
  • Centenas de milhares de produtos com variantes, marcacoes, imagens - banco de 15 GB
  • 50+ mini-sites de distribuidores personalizados ativos
  • 12 funcionalidades plenamente operacionais entregues: importacao de catalogos, importacao massiva, atualizacao automatica, extranet multi-perfis, busca avancada, exportacao CSV/PDF, mini-sites, assinaturas, estatisticas, publicidade, newsletters, gestao multilingue
Metricas do codebase
Tipos de importacao - Numero de campos CSV por tipo

O dia seguinte do projeto

O que aconteceu apos a implantacao final

Resultado imediato (2019): Os backups exaustivos de marco e agosto de 2019 (incluindo bash_history, chaves SSH, capturas de tela e multiplos dumps SQL) sugerem uma fase de transicao - provavelmente relacionada a uma saida ou arquivamento. O backup de agosto de 2019 inclui 441 capturas de tela documentando sistematicamente todo o ecossistema.

A medio prazo: O ultimo arquivo modificado no backup data de novembro de 2019. A exaustividade da documentacao (paginas wiki, documentos de processos, scripts de implantacao) indica um esforco consciente para garantir a transferencia de conhecimento.

Estado atual: O projeto esta arquivado. A plataforma European Sourcing continuou a operar independentemente, mas o codebase original documentado nestes backups representa um instantaneo de um sistema maduro de 12 anos em seu estado final. As escolhas tecnicas (Symfony v2, Docker, filas assincronas) demonstraram a consciencia da equipe sobre a necessidade de modernizacao.

A longevidade da arquitetura inicial (12 anos em producao) valida muitas das escolhas de design originais, particularmente a separacao front/back MySQL e a estrategia de desnormalizacao para a performance de busca multilingue.

Minha reflexao critica

Retrospectiva honesta sobre 12 anos de engenharia

Pontos fortes
  • Longevidade

    O sistema operou por 12+ anos - evidencia de uma arquitetura fundamentalmente solida

  • Ampla cobertura funcional

    Importacao, exportacao, busca, mini-sites, pagamentos, estatisticas, newsletters - tudo com uma equipe relativamente pequena

  • Desnormalizacao pragmatica

    Tabelas pre-calculadas por idioma (__es_produits_selection_fr/en/de/es/it) resolveram efetivamente a performance de busca

  • Arquitetura MySQL madura

    Separacao leitura/escrita com balanceamento ProxySQL estava a frente do seu tempo para um monolito PHP

  • Automacao de feeds de fornecedores

    O sistema de atualizacao FTP/XML cobria os principais fornecedores, reduzindo drasticamente a digitacao manual

Pontos de melhoria
  • Framework customizado

    Um framework PHP caseiro ao inves de Symfony/Laravel criou divida tecnica significativa e dificultou contratacoes

  • Lacunas de seguranca

    Credenciais em texto claro no codigo e configuracao, queries SQL nao parametrizadas, sem CORS/CSP

  • Sem cobertura de testes

    Nenhum teste unitario ou de integracao na versao legacy, tornando cada evolucao arriscada

  • Codigo especifico por fornecedor

    auto_mise_a_jour.php continha logica hardcoded por fornecedor ao inves de um padrao generico de conectores/adaptadores

  • Sem pipeline CI/CD

    Deploy manual via SVN export e shell scripts, sem pipeline automatizado de testes ou deploy

O que eu faria diferente
  • Adotar um framework da comunidade desde o inicio (Symfony 1.x existia desde 2007)
  • Projetar um sistema generico de conectores de fornecedores com adaptadores por formato (CSV, XML, JSON) e configuracao declarativa
  • Implementar uma fila de mensagens desde o dia um (RabbitMQ, Beanstalk) ao inves de scripts batch com set_time_limit
  • Separar o armazenamento de imagens em um CDN/S3 ao inves do filesystem local
  • Adicionar testes automatizados progressivamente, comecando pelas funcoes criticas de importacao e correspondencia de referencias
Licoes duradouras
  • A importacao de dados heterogeneos e um problema importante de engenharia - cada fornecedor tem seus proprios formatos, convencoes, codificacoes e particularidades. Um sistema robusto precisa de arquitetura extensivel com adaptadores, validacao e logging exaustivo.

  • A desnormalizacao e um compromisso valido quando a performance de leitura e critica e os dados evoluem em batches - mas a sincronizacao deve ser automatizada e a consistencia monitorada.

  • Projetos de ciclo longo inevitavelmente acumulam divida tecnica - planejar fases de refatoracao e essencial ao inves de esperar uma reescrita total.

  • Migracao e um processo, nao um evento - a coexistencia do legacy (PHP custom + SVN) e v2 (Symfony + Git) por varios anos mostra que migracoes acontecem incrementalmente.

Arquitetura completa do ecossistema (Draw.io)

Arquitetura completa do ecossistema (Draw.io)
Modelo de dados principal (diagrama ER)
Fluxo de dados de importacao CSV (v2)
Distribuicao tecnologica
Distribuicao da infraestrutura

Trajetoria relacionada

Experiencia profissional ligada a esta realizacao

Competencias aplicadas

Competencias tecnicas e humanas aplicadas

Galeria de imagens

Capturas e visuais do projeto