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
| Campo | Valor |
|---|---|
artifactId | order-pi-dynamics-gold |
groupId | com.hawkersco |
version | 1.0.25 |
| Java | 25 |
| Spring Boot | 4.0.6 |
| Tipo de artefacto | jar (ejecutable, Spring Boot batch/CLI) |
| Módulos | No 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, OrderMeliCoPiDynamicsGoldRunner | Mercado Libre / Mercado Libre Colombia |
OrderSfccPiDynamicsGoldRunner, OrderSfccMxPiDynamicsGoldRunner, OrderSfccCoPiDynamicsGoldRunner, OrderSfccNwPiDynamicsGoldRunner | Variantes SFCC |
OrderSfccMxPaidZeroPiDynamicsGoldRunner, OrderSfccCoPaidZeroPiDynamicsGoldRunner | Pedidos SFCC con importe pagado cero (MX/CO) |
OrderMiraviaPiDynamicsGoldRunner, OrderDecathlonPiDynamicsGoldRunner, OrderECIPiDynamicsGoldRunner, OrderFalabellaPiDynamicsGoldRunner | Miravia, Decathlon, ECI, Falabella |
OrderPrivaliaPiDynamicsGoldRunner, OrderPrivaliaMarketplacePiDynamicsGoldRunner | Privalia (directo y marketplace) |
OrderCoppelPiDynamicsGoldRunner, OrderLiverpoolPiDynamicsGoldRunner | Coppel, Liverpool |
OrderShowroomPiDynamicsGoldRunner, OrderTheBraderyPiDynamicsGoldRunner | Showroom, TheBradery |
OrderBrandingPiDynamicsGoldRunner | Pedidos de branding/personalización |
StatusOrderPiDynamicsGoldRunner | Sincronización de estados de vuelta a Dynamics Gold |
ManualStatusPiFactPiDynamicsGoldRunner | Actualización manual de estado (tarea puntual) |
UpdateDataDynamicsGoldRunner | Actualización masiva de datos maestros |
.config—DynamicsDbConfig(BD Dynamics Gold),LogisticsDbConfig(BDlogistics)..utils—OrderPiDynamicsGoldUtils(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
| Dependencia | Propósito |
|---|---|
spring-boot-starter | Núcleo de Spring Boot (sin web, es un runner CLI) |
com.hawkersco:dynamics-client / dynamics-commons | Cliente y entidades de Dynamics 365 |
com.hawkersco:sfcc-commons | Modelos 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-client | Clientes @HttpExchange por plataforma |
com.hawkersco:recharge-client, sprintlogistics-client | Suscripciones de lentillas, datos logísticos |
com.hawkersco.posclient:pos-client | Punto de venta |
com.hawkersco:slack-client | Notificaciones 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
| Sistema | Protocolo | Dirección | Detalle |
|---|---|---|---|
| Dynamics 365 Gold REST API | HTTP REST, OAuth2 (2 client secrets) | Saliente | Creació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, TheBradery | HTTP REST | Entrante | Lectura de pedidos por plataforma |
| Recharge | HTTP, tokens por país | Saliente | Suscripciones de lentillas |
| Slack | HTTP (SlackClient) | Saliente | Notificaciones de error |
PostgreSQL (Dynamics Gold, logistics) | JDBC (doble datasource) | Entrante/Saliente | Lectura 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).
| Clave | Descripción |
|---|---|
spring.profiles.active | Determina 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-secret | Dos secretos OAuth de Dynamics 365 |
slack.auth.token | Token de bot de Slack |
lenses.recharge.token | Tokens de Recharge por país |
meli.credentials.clientsecret | Credencial 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(baseeclipse-temurin:25-jre,containerizingMode=packaged), publicada eneurope-west3-docker.pkg.dev/pi-saldum/pi-repo/order-pi-dynamics-gold:<tag>. - Orquestación: Kubernetes
CronJoben el clúster GKEpi-cluster-hw, namespacepi, ejecutándose cada 30 minutos. - CI/CD (Jenkins): pipeline real de 3 etapas —
Checkout→Build & Push→Deploy to GKE. ElCLAUDE.mddescribeKICS security scanySonarQubeque no aparecen en elJenkinsfileactual (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.mdcita una dependenciashein-clientque no existe: mismo patrón de integración ficticia detectado enorder-pi-dynamics,pi-generate-credentialsylogistics-status-processde este ecosistema.- El perfil activo por defecto en
application.propertiesno coincide conCLAUDE.md: el documento existente afirma que en desarrollo soloStatusOrderPiDynamicsGoldRunnerestá activo; el fichero real tienespring.profiles.active=OrderBrandingPiDynamicsGoldRunner. - Número de runners ligeramente distinto del documentado:
CLAUDE.mdafirma "21 runner classes"; el recuento real del árbol de código es 22 (incluyendoManualStatusPiFactPiDynamicsGoldRunner, que no aparece mencionado explícitamente en la lista deCLAUDE.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 enOrderPiDynamicsGoldApplicationyOrderMeliPiDynamicsGoldRunner. - Ver alerta de seguridad en la sección 7 sobre el elevado volumen de credenciales reales expuestas en
application.properties.