Skip to main content

order-pi-dynamics-gold

1. Descripción general

Según el pom.xml, el proyecto se describe como "Send orders pi to dynamics gold". Es el equivalente "Gold" (data warehouse) de order-pi-dynamics: orquesta el envío de pedidos desde numerosas plataformas de e-commerce/marketplace (SFCC en sus variantes, Mercado Libre, Mercado Libre Colombia, Miravia, Decathlon, El Corte Inglés, Falabella, Privalia, Privalia Marketplace, Coppel, Liverpool, Showroom, TheBradery) hacia el entorno Gold de Microsoft Dynamics 365.

2. Información técnica

CampoValor
artifactIdorder-pi-dynamics-gold
groupIdcom.hawkersco
version1.0.25
Java25
Spring Boot4.0.6
Tipo de artefactojar (ejecutable, Spring Boot batch/CLI)
MódulosNo aplica (proyecto de módulo único)

3. Arquitectura y diseño

No es una API REST: es una aplicación Spring Boot CLI con 22 CommandLineRunner (uno por plataforma o tarea), cada uno activado por un perfil de Spring (@Profile("NombreDelRunner")) y ejecutado de forma asíncrona (@Async + @EnableAsync en la clase principal).

RunnerÁmbito
OrderMeliPiDynamicsGoldRunner, OrderMeliCoPiDynamicsGoldRunnerMercado Libre / Mercado Libre Colombia
OrderSfccPiDynamicsGoldRunner, OrderSfccMxPiDynamicsGoldRunner, OrderSfccCoPiDynamicsGoldRunner, OrderSfccNwPiDynamicsGoldRunnerVariantes SFCC
OrderSfccMxPaidZeroPiDynamicsGoldRunner, OrderSfccCoPaidZeroPiDynamicsGoldRunnerPedidos SFCC con importe pagado cero (MX/CO)
OrderMiraviaPiDynamicsGoldRunner, OrderDecathlonPiDynamicsGoldRunner, OrderECIPiDynamicsGoldRunner, OrderFalabellaPiDynamicsGoldRunnerMiravia, Decathlon, ECI, Falabella
OrderPrivaliaPiDynamicsGoldRunner, OrderPrivaliaMarketplacePiDynamicsGoldRunnerPrivalia (directo y marketplace)
OrderCoppelPiDynamicsGoldRunner, OrderLiverpoolPiDynamicsGoldRunnerCoppel, Liverpool
OrderShowroomPiDynamicsGoldRunner, OrderTheBraderyPiDynamicsGoldRunnerShowroom, TheBradery
OrderBrandingPiDynamicsGoldRunnerPedidos de branding/personalización
StatusOrderPiDynamicsGoldRunnerSincronización de estados de vuelta a Dynamics Gold
ManualStatusPiFactPiDynamicsGoldRunnerActualización manual de estado (tarea puntual)
UpdateDataDynamicsGoldRunnerActualización masiva de datos maestros
  • .configDynamicsDbConfig (BD Dynamics Gold), LogisticsDbConfig (BD logistics).
  • .utilsOrderPiDynamicsGoldUtils (lógica compartida), OrderSfccPiDynamicsGoldUtils/OrderSfccCoPiDynamicsGoldUtils/OrderSfccMxPiDynamicsGoldUtils (específicas por región SFCC), StatusOrderPiDynamicsGoldUtils, UpdateDataDynamicsGoldUtils, OrderPiDynamicsGoldCons, OrderVerifyPiDynamicsGoldUtils, OrderPiDynamicsGoldErrorUtils, LenientLongTypeAdapter.
flowchart TD
A[22 runners @Profile + @Async] -->|pedidos pendientes| B[(logistics · Order)]
A -->|obtiene pedido| C[API de la plataforma correspondiente]
A -->|valida y transforma| D[OrderPiDynamicsGoldUtils]
D -->|envía| E[Dynamics 365 Gold REST API]
A -.->|error| F[Slack]

4. Dependencias principales

DependenciaPropósito
spring-boot-starterNúcleo de Spring Boot (sin web, es un runner CLI)
com.hawkersco:dynamics-client / dynamics-commonsCliente y entidades de Dynamics 365
com.hawkersco:sfcc-commonsModelos de pedido SFCC
com.hawkersco:meli-client, miravia-client, decathlon-client, eci-client, falabella-client, privalia-client, privalia-marketplace-client, coppel-client, qat-client (Liverpool), showroom-client, bradery-clientClientes @HttpExchange por plataforma
com.hawkersco:recharge-client, sprintlogistics-clientSuscripciones de lentillas, datos logísticos
com.hawkersco.posclient:pos-clientPunto de venta
com.hawkersco:slack-clientNotificaciones de error

No existe dependencia shein-client en el pom.xml, pese a que CLAUDE.md la cita como integración interna — mismo patrón de integración ficticia ya detectado en order-pi-dynamics, pi-generate-credentials y logistics-status-process de este ecosistema.

5. API / Endpoints

No aplica a este proyecto. Es un batch/runner sin capa REST.

6. Integraciones externas

SistemaProtocoloDirecciónDetalle
Dynamics 365 Gold REST APIHTTP REST, OAuth2 (2 client secrets)SalienteCreación/actualización de pedidos y datos maestros
Mercado Libre, Mercado Libre Colombia, Miravia, Decathlon, El Corte Inglés, Falabella, Privalia (x2), Coppel, Liverpool, Showroom, TheBraderyHTTP RESTEntranteLectura de pedidos por plataforma
RechargeHTTP, tokens por paísSalienteSuscripciones de lentillas
SlackHTTP (SlackClient)SalienteNotificaciones de error
PostgreSQL (Dynamics Gold, logistics)JDBC (doble datasource)Entrante/SalienteLectura de pedidos pendientes y escritura en Dynamics Gold

7. Configuración

En producción (application-pro.properties) las credenciales llegan por variables de entorno inyectadas como Secret de Kubernetes (26 variables según el propio CLAUDE.md); en local (application.properties) el repositorio contiene actualmente una cantidad muy elevada de valores reales hardcodeados (ver alerta de seguridad).

ClaveDescripción
spring.profiles.activeDetermina qué runner se ejecuta en local — actualmente OrderBrandingPiDynamicsGoldRunner (ver hallazgo en la sección 13)
spring.datasource.* / logistics.datasource.*Credenciales de las BD Dynamics Gold y logistics
dynamics.login.client-secret / dynamics.picustomersetup.login.client-secretDos secretos OAuth de Dynamics 365
slack.auth.tokenToken de bot de Slack
lenses.recharge.tokenTokens de Recharge por país
meli.credentials.clientsecretCredencial OAuth de Mercado Libre

🛑 Alerta de seguridad — volumen muy elevado de credenciales reales

El fichero src/main/resources/application.properties (perfil local) contiene credenciales reales de múltiples sistemas: ambas bases de datos PostgreSQL (contraseña compartida ya señalada como expuesta en múltiples proyectos de este ecosistema, y la misma reutilizada en order-pi-dynamics), dos secretos OAuth de Dynamics 365 (distintos de los de order-pi-dynamics pero con el mismo propósito), el token de bot de Slack, los tokens de Recharge por país, y el client secret de Mercado Libre (el mismo ya señalado como expuesto en meli-create-db/meli-co-create-db). Ninguna se ha reproducido en este documento. Se recomienda rotar todas estas credenciales con prioridad alta, dada la centralidad de este proyecto en el flujo de pedidos hacia el ERP.

8. Persistencia

Dos bases de datos PostgreSQL independientes: Dynamics Gold (vía dynamics-commons) y logistics (vía logistics-commons). No hay Flyway/Liquibase en este repositorio.

9. Procesos programados y mensajería

No hay @Scheduled, pero los runners se ejecutan de forma asíncrona (@Async) dentro de una misma invocación. La periodicidad la impone el CronJob de Kubernetes, que ejecuta el contenedor cada 30 minutos según el propio CLAUDE.md. En producción se activan simultáneamente los ~19-22 perfiles de runner.

10. Ejecución en local

Requisitos previos: JDK 25, Maven, acceso a ambas BD y credenciales válidas de la plataforma/runner que se quiera probar.

# Compilar sin tests
./mvnw clean install -DskipTests

# Compilar con tests
./mvnw clean install

# Ejecutar todos los tests
./mvnw test

# Ejecutar un test concreto
./mvnw test -Dtest=OrderPiDynamicsGoldApplicationTests

# Ejecutar con un perfil concreto
./mvnw spring-boot:run -Dspring-boot.run.arguments="--spring.profiles.active=OrderSfccPiDynamicsGoldRunner"

Al ser un conjunto de CommandLineRunner, no expone Actuator/health: la verificación se hace revisando el log de consola o el estado de los pedidos en Dynamics Gold/BD.

11. Despliegue

  • Imagen: construida con jib-maven-plugin (base eclipse-temurin:25-jre, containerizingMode=packaged), publicada en europe-west3-docker.pkg.dev/pi-saldum/pi-repo/order-pi-dynamics-gold:<tag>.
  • Orquestación: Kubernetes CronJob en el clúster GKE pi-cluster-hw, namespace pi, ejecutándose cada 30 minutos.
  • CI/CD (Jenkins): pipeline real de 3 etapas — CheckoutBuild & PushDeploy to GKE. El CLAUDE.md describe KICS security scan y SonarQube que no aparecen en el Jenkinsfile actual (mismo patrón detectado en varios proyectos hermanos de este lote).

Job de Jenkins: https://jenkins-pi.hawkersco.net/job/order-pi-dynamics-gold/

12. Manejo de errores y logging

No hay una estrategia de excepciones centralizada (no hay @ControllerAdvice, es un conjunto de runners). OrderPiDynamicsGoldErrorUtils centraliza el formato de error y la notificación a Slack. Logging mediante java.util.logging.Logger/SLF4J según la clase.

13. Notas y consideraciones

  • CLAUDE.md cita una dependencia shein-client que no existe: mismo patrón de integración ficticia detectado en order-pi-dynamics, pi-generate-credentials y logistics-status-process de este ecosistema.
  • El perfil activo por defecto en application.properties no coincide con CLAUDE.md: el documento existente afirma que en desarrollo solo StatusOrderPiDynamicsGoldRunner está activo; el fichero real tiene spring.profiles.active=OrderBrandingPiDynamicsGoldRunner.
  • Número de runners ligeramente distinto del documentado: CLAUDE.md afirma "21 runner classes"; el recuento real del árbol de código es 22 (incluyendo ManualStatusPiFactPiDynamicsGoldRunner, que no aparece mencionado explícitamente en la lista de CLAUDE.md).
  • Pipeline de Jenkins más simple de lo documentado: ver hallazgo en la sección 11.
  • El resto de la arquitectura descrita en CLAUDE.md (activación por perfil, ejecución asíncrona con @EnableAsync/@Async, doble datasource) coincide con el código real, verificado directamente en OrderPiDynamicsGoldApplication y OrderMeliPiDynamicsGoldRunner.
  • Ver alerta de seguridad en la sección 7 sobre el elevado volumen de credenciales reales expuestas en application.properties.