CP-9331 · v2.0 · Exploración Técnica Cementos Pacasmayo · Digou / SAP Commerce

NODUS — Observabilidad
de Procesos de Negocio

Digou ya tiene Dynatrace para monitoreo técnico. El gap real está en otro nivel: órdenes que SAP ERP rechaza con HTTP 200, precios inconsistentes, clientes bloqueados por crédito sin notificación. Esos errores son invisibles para cualquier APM.

Distinción clave: un error de integración ERP suele llegar con HTTP 200 OK. Dynatrace ve éxito. El cliente ve un carrito que no avanza. NODUS ve el proceso de negocio fallido.

Dynatrace

ya cubre APM · infra · JVM

0%

cobertura actual de errores ERP de negocio

2

gaps nuevos a cubrir (Sentry + NODUS)

Decisiones clave

Dynatrace — no tocar

Ya cubre APM técnico en Digou. El equipo técnico lo usa. NODUS no duplica esto.

Sentry SDK — gap frontend

Dynatrace no cubre el browser del cliente. Sentry captura errores JS que bloquean el flujo de compra.

NODUS — gap de negocio ERP

Dashboard para el equipo de negocio. Muestra procesos fallidos en Digou ↔ SAP ERP en lenguaje de negocio, no técnico.

Spring EventListener — puente

Capta eventos de negocio en Hybris (orden rechazada, crédito bloqueado) y los publica a NODUS. Sin logs, sin APM.

AnalistaMatty
PlataformaDigou / SAP Commerce
FechaJunio 2026 · v2.0
S

Stack de Observabilidad — Tres Capas

Cada herramienta cubre lo que la otra no puede ver

Ya existe Técnico

Dynatrace

APM · Infra · JVM · Logs de servidor

Errores HTTP del servidor (4xx, 5xx)
Performance JVM / OutOfMemory
Timeouts de base de datos
Trazas de request end-to-end
Errores en browser del cliente
Procesos de negocio ERP (HTTP 200 ≠ éxito)
Audiencia: equipo técnico / DevOps
Nuevo — esfuerzo bajo Frontend

Sentry SDK

Errores JavaScript en el browser del cliente

TypeError / ReferenceError en carrito o checkout
Llamadas HTTP fallidas desde el browser
Flujos truncos de UX (formularios que no validan)
Core Web Vitals (LCP, FID)
Integración: snippet en storefront (I1)
Audiencia: equipo frontend
Nuevo — el gap real Negocio

NODUS App

Procesos de negocio fallidos en Digou ↔ SAP ERP

Órdenes rechazadas por ERP (con HTTP 200)
Precios inconsistentes Digou ≠ SAP ERP
Stock desincronizado → órdenes que fallan al confirmar
Crédito bloqueado sin notificación al cliente
Pedido sin factura / confirmación no enviada
Audiencia: equipo de negocio (no requiere leer Dynatrace)

¿Qué cubre cada herramienta?

Tipo de evento Dynatrace Sentry NODUS ¿Por qué importa?
Error 5xx en OCC APIDynatrace lo ve, es error técnico
TypeError JS en carritoOcurre en browser, fuera del servidor
Orden rechazada por ERPHTTP 200 — Dynatrace ve éxito, el cliente ve error
Precio inconsistente Digou ≠ ERPNo es error técnico — es discrepancia de datos
Stock desincronizadoSync técnicamente OK, datos de negocio incorrectos
Crédito bloqueado en ERPRegla de negocio ERP, invisible para APM
CronJob Sync fallidoImpactoDynatrace ve el fallo técnico; NODUS muestra el impacto en negocio
F

Flujo de un Error de Proceso de Negocio

Anatomía de un error ERP que Dynatrace no puede detectar

1

Cliente

Genera una orden en Digou

Todo fluye normal. Carrito, checkout, datos de envío.

2

Digou / Hybris

Procesa y envía a ERP

OCC API responde. Hybris crea la orden. Dynatrace: ✓ todo OK.

HTTP 200
3

SAP ERP — El gap

ERP rechaza la orden

Límite de crédito excedido. Pero devuelve HTTP 200 con body: status: REJECTED.

HTTP 200 ≠ éxito
4

Dynatrace

No detecta nada

Ve HTTP 200. Sin excepción. Sin error de log. Sin alerta. Dashboard verde.

Invisible
5

NODUS

Lo detecta y alerta

Spring EventListener captura el evento de negocio y publica el proceso fallido con impacto comercial (R3).

Proceso fallido

Tipos de errores de proceso de negocio ERP

CRÍTICOCrédito bloqueado

Cliente intenta comprar. ERP rechaza por límite de crédito. Hybris no notifica al cliente. El carrito queda "colgado". HTTP 200 en todos los requests.

CRÍTICOOrden sin picking en ERP

Digou confirma la orden. SAP ERP no genera el picking. El cliente recibió confirmación pero el pedido nunca entra en el proceso logístico.

ALTOPrecio inconsistente Digou ≠ ERP

Digou muestra S/ 450. SAP ERP tiene S/ 480. El cliente paga un precio, la factura dice otro. Riesgo de reclamación comercial.

ALTOStock desincronizado

Digou muestra 200 bolsas disponibles. ERP tiene 0. El cliente compra, la orden se crea, pero no puede despacharse. Diferencia >10% dispara R5.

ALTOProducto en ERP no aparece en catálogo

Producto activo en SAP ERP pero no indexado en Digou/Solr. El cliente no puede comprarlo. Revenue perdido sin error técnico.

MEDIOFactura no generada

Orden exitosa en Digou pero SAP ERP no genera el documento comercial. Se detecta en la siguiente conciliación, no en tiempo real.

P

Prototipo Interactivo — NODUS Dashboard

Dos perspectivas del mismo evento. Seleccioná el rol para ver la vista correspondiente.

Vista: Gerente comercial / Jefe de ventas
D

Modelo de Datos

5 entidades principales de la App NODUS

Entidad central

BusinessEvent

idstring · UUID
eventType'ORDER_REJECTED' | 'PRICE_MISMATCH' | 'STOCK_DRIFT' | 'CREDIT_BLOCKED' | 'CATALOG_GAP' | 'INVOICE_MISSING'
timestampISO8601
customerIdstring (ID cliente ERP)
orderIdstring | null
revenueAtRisknumber (PEN)
severity'CRÍTICO' | 'ALTO' | 'MEDIO'
source'erp_event' | 'sentry' | 'dynatrace_webhook'
technicalHttpStatusnumber (ej: 200 aunque falle)
{
  "id": "evt-9b2c1",
  "eventType": "ORDER_REJECTED",
  "timestamp": "2026-06-11T14:23:17Z",
  "customerId": "CLI-00482",
  "orderId": "DGO-2026-08821",
  "revenueAtRisk": 24500,
  "severity": "CRÍTICO",
  "source": "erp_event",
  "technicalHttpStatus": 200
}
Entidad

Incident

idstring · INC-XXXXX
eventId→ BusinessEvent.id
status'NUEVO' | 'EN_REVISIÓN' | 'RESUELTO'
persona'negocio' | 'tecnico' | 'ambos'
assigneestring | null
slaMinutesnumber (15 | 60 | 480)
slaBreachedboolean
dynatraceAlertIdstring | null (si tiene correlación técnica)
{
  "id": "INC-B001",
  "eventId": "evt-9b2c1",
  "status": "NUEVO",
  "persona": "negocio",
  "assignee": null,
  "slaMinutes": 15,
  "slaBreached": false,
  "dynatraceAlertId": null
}
Entidad

AlertRule

idstring · R[N]
eventTypesstring[] (tipos de BusinessEvent)
thresholdnumber | null
severity'CRÍTICO' | 'ALTO' | 'MEDIO'
channelsstring[]
audience'negocio' | 'tecnico' | 'ambos'
enabledboolean
{
  "id": "R3",
  "eventTypes": ["ORDER_REJECTED","CREDIT_BLOCKED"],
  "severity": "CRÍTICO",
  "channels": ["slack-negocio","email-comercial"],
  "audience": "negocio",
  "enabled": true
}
Entidad

ERPIntegrationLog

idstring · UUID
direction'digou_to_erp' | 'erp_to_digou'
operation'order_create' | 'price_sync' | 'stock_sync' | 'credit_check'
httpStatusnumber
businessStatus'success' | 'rejected' | 'partial' | 'unknown'
erpResponseBodyJSON (parseado para detectar rechazos)
businessEventId→ BusinessEvent.id | null
{
  "operation": "order_create",
  "httpStatus": 200,
  "businessStatus": "rejected",
  "erpResponseBody": {
    "status": "REJECTED",
    "reason": "CREDIT_LIMIT_EXCEEDED",
    "creditLimit": 50000,
    "currentExposure": 51200
  }
}
R

Reglas de Negocio

Cada R# se convierte 1:1 en una historia de backlog · Dynatrace cubre las reglas técnicas, NODUS cubre las de negocio

R1negocio

Orden rechazada por SAP ERP → CRÍTICO aunque el HTTP sea 200

NODUS inspecciona el body de respuesta de las llamadas a SAP ERP. Si el campo status contiene REJECTED o similar, crea un BusinessEvent de tipo ORDER_REJECTED con severidad CRÍTICO. No depende del HTTP status code.

R2frontend

Error JS que bloquea flujo de checkout/carrito → CRÍTICO

Excepción capturada por Sentry (I1) en rutas /cart o /checkout. No cubierta por Dynatrace porque ocurre en el browser del cliente. NODUS recibe el evento de Sentry vía webhook y lo muestra en la vista técnica.

R3negocio

Crédito bloqueado sin notificación al cliente → CRÍTICO

Cuando SAP ERP devuelve CREDIT_LIMIT_EXCEEDED, Hybris silencia el error. NODUS captura el evento vía Spring EventListener (I3), crea un incidente CRÍTICO para el equipo comercial e incluye el monto de crédito en riesgo.

R4negocio

Precio inconsistente Digou ≠ SAP ERP (>1% de diferencia) → ALTO

NODUS compara precios del catálogo Digou vs los precios enviados por ERP en la última sincronización. Diferencia superior al 1% en cualquier SKU activo genera un incidente ALTO. Umbral configurable por categoría de producto.

R5negocio

Stock desincronizado: diferencia >10% entre Digou y ERP → ALTO

Si la cantidad disponible en Digou supera en más del 10% la cantidad real en SAP ERP para un producto activo, NODUS genera un incidente ALTO de tipo STOCK_DRIFT. Umbral configurable por SKU o familia.

R6negocio

Orden sin picking en ERP pasados 30 min → ALTO

Si una orden confirmada en Digou no genera un documento de picking en SAP ERP dentro de 30 minutos, NODUS crea un incidente ALTO. El cliente ya recibió confirmación pero el pedido no entra en logística. Ventana de tiempo configurable.

R7SLA

SLA CRÍTICO negocio: respuesta ≤15 min — canal: Slack #negocio-criticos + Email comercial

Incidentes R1 y R3 deben ser reconocidos por el equipo comercial en ≤15 min. El canal técnico (PagerDuty) solo se activa si existe correlación con un error técnico real en Dynatrace.

R8SLA

SLA ALTO negocio: respuesta ≤1 hora — canal: Slack #negocio-high + Email

Incidentes R4, R5 y R6 deben gestionarse en ≤60 min. Si el SLA vence sin assignee, NODUS escala automáticamente y notifica al responsable de guardia del área comercial.

I

Integraciones

NODUS no reemplaza Dynatrace — lo complementa con la capa de negocio

# Integración Dirección Mecanismo Nota Propietario
I1 Sentry SDK → Storefront Digou Outbound (browser) Snippet JS / módulo @sentry/angular (Spartacus) Dynatrace no cubre errores JS del browser Matty / Frontend
I2 Dynatrace → NODUS (webhook) Inbound a NODUS Dynatrace Problem Notification webhook Correlaciona alerta técnica con impacto de negocio. Enriquece incidentes técnicos con contexto ERP. DevOps
I3 SAP ERP EventListener → NODUS Outbound (Hybris) Spring @EventListener en Hybris. Captura OrderPlacedEvent, CheckoutFailedEvent, CreditCheckEvent Integración clave. Intercepta la respuesta ERP y detecta rechazos con HTTP 200. Dev backend
I4 NODUS → Slack Webhook Outbound HTTP POST JSON (Incoming Webhook). Canales separados por audience. #negocio-criticos · #negocio-high · #tech-alerts Equipo NODUS
I5 NODUS → Email SMTP Outbound Email diferenciado por persona: lenguaje comercial (negocio) o técnico PagerDuty solo si hay correlación técnica real (I2) Equipo NODUS

✓ No configurar Filebeat ni Log4j2 HttpAppender

Dynatrace ya centraliza los logs técnicos del servidor en CCv2. Duplicar con Filebeat generaría ruido y costo innecesario. I3 (Spring EventListener) es el mecanismo correcto para los eventos de negocio que Dynatrace no interpreta.

E

Edge Cases

Situaciones límite específicas del gap ERP-negocio

EC1

Dynatrace ya alertó del mismo problema — no duplicar notificación

Situación: Un CronJob fallido causa errores técnicos (Dynatrace alerta) Y datos desincronizados (NODUS alerta). El equipo recibe dos alertas del mismo incidente.

Comportamiento esperado: Si NODUS recibe via I2 una alerta de Dynatrace correlacionada, enriquece el incidente técnico con el impacto de negocio en lugar de crear uno nuevo. Campo dynatraceAlertId en Incident.

I2
NODUS
EC2

ERP devuelve HTTP 200 con status REJECTED — clasificar correctamente

Situación: La mayoría de errores de negocio ERP llegan con HTTP 200. El Spring EventListener (I3) debe parsear el body para detectar rechazos, no confiar en el HTTP status.

Comportamiento esperado: El EventListener inspecciona campos como status, result, errorCode en el body ERP. Lista de patrones de rechazo configurables.

I3
Dev backend
EC3

Error de Backoffice sin impacto en cliente — no notificar a negocio

Situación: Errores en Backoffice/HMC afectan al administrador pero no al storefront del cliente.

Comportamiento esperado: El EventListener filtra por origen del evento. Eventos de Backoffice van al log de NODUS como MEDIO sin notificación push al equipo comercial.

R7
NODUS
EC4

Stock desincronizado pero sin órdenes activas del SKU

Situación: Un SKU tiene stock incorrecto pero ningún cliente lo ha comprado en las últimas 24h.

Comportamiento esperado: NODUS clasifica el incidente como MEDIO (R8 SLA: día hábil) en lugar de ALTO. El umbral de urgencia R5 solo aplica si hay actividad de compra reciente del SKU.

R5
NODUS
EC5

Crédito bloqueado legítimamente — no es un error

Situación: El bloqueo de crédito es una regla de negocio válida, no un fallo del sistema. Pero el cliente necesita saber por qué no puede comprar.

Comportamiento esperado: NODUS crea el incidente para el equipo comercial (notificación al ejecutivo de cuenta del cliente). El ERP no siempre notifica al storefront, así que Hybris debe mostrar un mensaje claro al cliente basado en el evento capturado por I3.

R3
Comercial
B

A-BUILD — Próximos Pasos

Dynatrace ya está. Lo nuevo se divide en tres frentes paralelos.

A

Confirmaciones async (Matty)

  • Confirmar tecnología storefront (Spartacus/Angular vs Accelerator/JSP) → define método I1
  • Confirmar si Dynatrace está activo en la instancia actual de Digou (valida I2)
  • Mapear los eventos de negocio disponibles en Spring (OrderPlacedEvent, CheckoutFailedEvent, CreditCheckEvent) → define scope I3
  • Definir lista de CronJobs críticos con Matty para umbral de stock/precios
Sin reunión · Async · Bloquea frentes B y C
B

Spring EventListener + Parser ERP (Dev backend)

  • Implementar @EventListener en Hybris para OrderPlacedEvent / CreditCheckEvent (I3)
  • Desarrollar parser del body de respuesta ERP (detecta rechazos con HTTP 200) — EC2
  • Publicar BusinessEvent a NODUS vía webhook
  • Configurar webhook de Dynatrace Problem Notifications → NODUS (I2)
Requiere: resultado de A · Es la integración más crítica
C

Sentry SDK — gap de frontend (Frontend)

  • Integrar Sentry SDK al storefront de Digou (I1)
  • Si Spartacus: usar @sentry/angular como NgModule
  • Configurar alertas de Sentry → NODUS vía webhook (igual que I2)
  • Verificar captura de errores en flujo checkout/carrito (R2)
Paralelo con frente B · Esfuerzo bajo
D

App NODUS — dos vistas (Equipo CXD)

  • Vista negocio: KPIs de impacto comercial (órdenes en riesgo, valor, clientes afectados)
  • Vista técnica: feed de errores Sentry + correlación con Dynatrace (sin duplicar APM)
  • Notificaciones diferenciadas por audiencia — lenguaje de negocio vs técnico (I4, I5)
  • Demo Reel disponible como referencia de UX — ver artefacto paralelo
Requiere: frentes B y C · Demo Reel ya disponible

Por qué este formato funciona

El reencuadre: Dynatrace ya cubre el APM. El argumento de venta de NODUS no es "monitoreo" — es "observabilidad del proceso de negocio ERP", un gap que ninguna herramienta técnica puede llenar.

Dos audiencias, un artefacto: el equipo comercial no lee Dynatrace. NODUS les habla en su idioma: órdenes rechazadas, clientes bloqueados, valor en riesgo.

Demo Reel paralelo: la app ya está prototipada con ambas vistas. El equipo valida con usuarios reales antes de codear una línea del EventListener.