Skip to main content

01. Contexto y principios arquitectónicos

1.1 Situación actual (punto de partida TO-BE)​

Actualmente no existe Nexus. Se requiere construir desde cero una plataforma de integración que:

  1. Reciba solicitudes de creación de Órdenes de Compra desde múltiples sistemas externos.
  2. Valide reglas estructurales, sintácticas, semánticas y de negocio configurables por partner.
  3. Persista transaccionalmente el estado.
  4. Publique asíncronamente el trabajo a realizar.
  5. Cree la OC en Oracle Fusion Procurement (primer ERP objetivo).
  6. Permita al cliente consultar el estado en cualquier momento y reprocesar fallos de forma controlada.

1.2 Actores y sistemas que interactúan​

Actor / SistemaRolAlcance
Partner / Sistema externo (GEPP, Company B, Marketplace, EDI Gateway, sistemas internos)Emite solicitudes de OC y consulta estados.Ingesta + Consultas.
API Gateway / Edge (existente en Alpura)Termina TLS, valida token JWT (OAuth 2.0), rate limiting, propagación headers.Todas las APIs públicas de Nexus.
Nexus (plataforma TO-BE)Implementa flujos de ingesta, validación, mensajería, transformación y adaptadores a ERP.Core.
Oracle Fusion ProcurementERP destino donde se materializa la OC.Primer adapter ERP.
Google Cloud Pub/SubBus de mensajes asíncrono.Mensajería + DLQ.
PostgreSQLBase de datos transaccional y de configuración.Persistencia.
OAuth 2.0 IdPEmite y valida tokens (client credentials).Seguridad.
Observability PlatformLogs / Traces / Métricas / Alertas.Operación.
Operador / Administrador NexusGestiona reglas, configuración y reprocesos manuales.APIs privadas de configuración.

1.3 Principios de diseño (guías de decisión)​

  1. Agnóstico del origen: el modelo canónico no representa a ningún socio; los mapeos de entrada viven en las clases Service o helpers de la capa WEB/Facade como _mapGeppToCanonical (métodos privados).
  2. Agnóstico del destino: la integración con Fusion pasa por la interface PurchaseOrderCreationService (dentro de la capa Service). Nuevos servicios SAPPurchaseOrderService, DynamicsPurchaseOrderService se agregan sin tocar el procesamiento core (Facade). Nuevas implementaciones usan Alpura-SDK para clientes REST, auth, resiliencia y tracing.
  3. Asíncrono por defecto: todo trabajo que puede fallar o depender de sistemas externos se ejecuta fuera del hilo de la API de ingesta.
  4. Datos primero, consistencia fuerte: persistencia transaccional + transactional outbox evitan inconsistencias DB vs Pub/Sub.
  5. Trazabilidad todo el camino: requestId único + eventId por evento + idempotencyKey por petición cliente.
  6. Configuración sobre código: reglas de negocio, mapeos y políticas se almacenan y versionan en PostgreSQL. Solo el motor de reglas vive en código.
  7. Seguridad por defecto: OAuth2, scopes granulares, secreto por partner, cifrado en reposo, logs sin PII. Seguridad se reutiliza desde la librería Alpura Security (WEB layer).
  8. Resiliencia distribuida: timeouts, retries exponenciales acotados, circuit breakers, bulkheads, DLQ + reproceso. Resiliencia se apoya en librerías de Alpura-SDK y Utilities (Commons).
  9. Arquitectura interna por capas: todo microservicio/worker usa WEB -> Facade -> Service -> Persistence + Commons transversal + Alpura-SDK cross. Nomenclatura de métodos uniforme (públicos CamelCase, privados _ al inicio; ideal 0-3 params).

1.4 Conceptos de identidad y multi-partner (qué es necesario y qué no)​

Concepto¿Necesario?Definición
partnerIdSí, obligatorioIdentificador lógico del socio/alianza que origina la solicitud (ej: GEPP, COMPANY_B, MARKETPLACE_ALFA). Configuración, reglas y credenciales viven asociadas a él.
companyIdSíCompañía dentro del grupo corporativo (ej: ALPURA_MX, ALPURA_GT). Un partnerId puede generar órdenes para múltiples companyId.
sourceSystemSíIdentifica el sistema técnico origen (ej: GEPP_ERP_S4, MARKETPLACE_WOOCOMMERCE, EDI_GENTRAN). Se usa para trazabilidad, filtros de reglas y troubleshooting.
tenantIdNo (en MVP)Se omite. Las necesidades de aislamiento se resuelven con partnerId + companyId, OAuth scopes y RBAC. No se implementa multitenancy a nivel de esquema/conexiones en MVP; se evalúa en fases posteriores si aparecen requisitos de aislamiento estricto.
externalReferenceSíIdentificador de la OC en el sistema origen, usado para idempotencia y correlación.
Evitar sobrediseño

Nexus es un integration hub multi-partner, no un SaaS multi-tenant. No implementar row-level filters por tenant, schemas por partner ni pooling de conexiones aislado en esta fase.

1.5 Inventario de componentes (matriz de clasificación)​

ComponenteTipoResponsabilidad principal
Nexus Purchase Order APIMicroservicioIngesta REST de OC + Transactional Outbox
Nexus Validation EngineComponente interno (dentro de Purchase Order API; puede extraerse a futuro)Ejecución del pipeline de validaciones dinámicas
Nexus Purchase Order ProcessorMicroservicio / Worker consolidadoConsume Pub/Sub y orquesta procesamiento (hacia adapter ERP). En MVP se consolida con Oracle Fusion Worker si el equipo es pequeño; opción por defecto: desacoplado.
Nexus Oracle Fusion Adapter / WorkerWorker + Adapter (Adapter = infrastructure layer)Consumidor Pub/Sub → transformación canónico→Fusion → invocación REST Oracle Fusion
Nexus Status APIMicroservicioConsulta de estado por requestId, búsqueda, historial
Nexus Configuration APIMicroservicioCRUD + activación/versionado de reglas, configuración partners, mapeos
Nexus Outbox PublisherComponente interno (dentro de Purchase Order API)Polling + publishing a Pub/Sub con marcado de processed
PostgreSQLInfraestructuraDatos transaccionales, configuración, reglas, auditoría, outbox
Google Cloud Pub/SubInfraestructuraTopics + subscriptions + DLQ
OAuth 2.0 Identity ProviderInfraestructuraClient credentials, JWT, scopes
Observability PlatformInfraestructuraLogs / Traces / Métricas / Dashboards / Alertas
Justificación de consolidación vs desacoplamiento
  • Consolidados en MVP: Status API + Purchase Order API pueden compartir despliegue para reducir costos y complejidad, pero deben mantener módulos desacoplados (distintos paquetes/application.usecase).
  • Desacoplados siempre: Configuration API (por seguridad y cambio frecuente) y Oracle Fusion Worker (por resiliencia ante llamadas externas).