Skip to main content

HLD: Electronic Data Interchange

Versión: 1.0 Fecha: 28 de mayo de 2025 Autor: Arquitecto de Tecnologías


1. INTRODUCCIÓN

El propósito de este documento de Definición de Arquitectura de Alto Nivel (High-Level Design, HLD) es proporcionar una visión global y comprensiva de la arquitectura del sistema propuesto. Este documento sirve como un puente entre los requisitos del negocio y la implementación técnica detallada, ofreciendo una representación abstracta de los componentes principales del sistema, sus interacciones y las decisiones arquitectónicas clave que guiarán el desarrollo.

A través de este HLD, buscamos proporcionar una guía clara y estructurada que facilitará la transición hacia las etapas de diseño detallado y desarrollo, asegurando que el sistema final sea robusto, eficiente y alineado con los objetivos del negocio.

2. OBJETIVOS

Los objetivos del documento son:

  1. Proporcionar una Visión General: Describir la arquitectura del sistema en un nivel alto, destacando los componentes principales, sus responsabilidades y cómo interactúan entre sí.
  2. Facilitar la Comunicación: Actuar como una herramienta de comunicación entre las partes interesadas, incluyendo gerentes, desarrolladores, arquitectos, y otros involucrados en el proyecto, asegurando que todos tengan una comprensión común del sistema.
  3. Establecer una Base Sólida: Sentar las bases para las fases de diseño detallado y desarrollo, proporcionando un marco estructural que guíe las decisiones técnicas y de implementación.
  4. Asegurar la Coherencia y la Escalabilidad: Garantizar que el diseño del sistema sea coherente con los objetivos del negocio y pueda escalar para satisfacer futuras necesidades y requerimientos.

2.3 ALCANCE

Este documento está estructurado para cubrir los siguientes aspectos esenciales de la arquitectura del sistema:

  • Descripción del Contexto y Alcance: Definir el contexto en el que se desarrollará el sistema y los límites de su alcance.
  • Visión General de la Arquitectura: Presentar un diagrama de alto nivel y una descripción de los componentes principales del sistema.
  • Descripción de Componentes Clave: Detallar los componentes principales, sus roles y responsabilidades.
  • Interacciones y Flujos de Datos: Describir cómo interactúan los componentes entre sí y cómo fluyen los datos a través del sistema.
  • Decisiones Arquitectónicas y Justificación: Documentar las decisiones arquitectónicas clave y las razones detrás de ellas.
  • Consideraciones de Seguridad y Escalabilidad: Discutir cómo se abordarán las preocupaciones de seguridad y cómo el diseño permitirá la escalabilidad del sistema.
  • Requisitos No Funcionales: Identificar y describir los requisitos no funcionales importantes que deben ser considerados en el diseño.

3. DESCRIPCIÓN GENERAL DEL CONTEXTO Y ALCANCE

3.1 DESCRIPCIÓN GENERAL DEL PROYECTO

El presente proyecto tiene como objetivo principal la automatización del procesamiento e ingesta de pedidos de clientes en el sistema Oracle Fusion ERP. Actualmente, los clientes pueden enviar archivos en formato EDI (Electronic Data Interchange) a través de un servidor SFTP o mediante un servicio web SOAP.

La solución propuesta implementará un flujo de integración robusto y escalable que comenzará con la recepción de estos archivos. Un proceso de integración basado en Apache Camel se encargará de mover los archivos recibidos a una ubicación de procesamiento y registrará sus metadatos esenciales en una base de datos. Posteriormente, la herramienta DELTA realizará el parseo (análisis sintáctico) de los archivos, extrayendo la información de cada pedido y almacenándola de forma estructurada en una base de datos PostgreSQL.

A continuación, un proceso Spring Batch leerá estos datos de pedidos, los enriquecerá con los metadatos previamente registrados y ejecutará validaciones de negocio línea por línea utilizando las APIs de Oracle Fusion. Las líneas validadas pasarán a un estado listo para ser procesadas. Otro proceso se encargará de tomar estas líneas validadas y crear los pedidos correspondientes en Oracle Fusion, nuevamente a través de sus APIs.

El sistema incorporará un mecanismo de reintentos para la creación de pedidos, gestionado por la máquina de estados, con un máximo de tres intentos por línea. ... Una máquina de estados (Spring State Machine) orquestará el procesamiento de cada línea de pedido, desde la validación hasta la creación en Oracle Fusion, incluyendo la lógica de reintentos y el manejo de errores.

Finalmente, se desarrollará una interfaz de usuario en Angular que proporcionará visibilidad completa sobre el estado de los archivos y los pedidos, permitiendo el seguimiento y la monitorización del flujo completo. Esta solución busca mejorar la eficiencia, reducir errores manuales y ofrecer una trazabilidad completa del proceso de carga de pedidos. Se adjunta maqueta esperada Dashboard sistema EDI


3.2 DESCRIPCIÓN DE ESCENARIOS Y SEGUIMIENTO

A continuación, se detallan los principales escenarios de negocio que la solución cubrirá:

Escenario 1: Procesamiento Exitoso de Archivo EDI vía SFTP

  1. Cliente: Deposita un archivo EDI en la carpeta "incoming" del SFTP.
  2. Sistema (Apache Camel): Detecta el nuevo archivo, lo mueve a la carpeta "outcoming" y registra sus metadatos (nombre, fecha, origen, etc.) en la base de datos.
  3. Sistema (DELTA): Parsea el archivo desde "outcoming", extrae los datos de cada línea de pedido y los inserta en la tabla de pedidos en PostgreSQL.
  4. Sistema (Spring Batch - Validación): Lee las líneas de pedido de PostgreSQL, las asocia con los metadatos del archivo, y valida cada línea utilizando las APIs de Oracle Fusion. Marca las líneas como "Validadas".
  5. Sistema (Spring Batch - Creación de Pedido): Toma las líneas "Validadas" y las ingresa como pedidos en Oracle Fusion a través de APIs. Marca las líneas como "Éxito".
  6. Usuario (Angular): Visualiza el estado del archivo y de cada línea de pedido como "Éxito".

Escenario 2: Procesamiento Exitoso de Archivo vía Servicio SOAP

  1. Cliente: Envía un archivo (contenido EDI) a través del servicio web SOAP.
  2. Sistema (Servicio SOAP): Recibe el archivo y lo deposita en la carpeta "incoming" del SFTP.
  3. Los pasos 2 al 6 del Escenario 1 se ejecutan de la misma manera.

Escenario 3: Procesamiento con Errores de Validación de Datos

  1. El flujo inicial (pasos 1-3 del Escenario 1 o 1-2 del Escenario 2) ocurre.
  2. Sistema (Spring Batch - Validación): Al validar una línea de pedido con las APIs de Oracle, se detecta un error en los datos (e.g., código de producto inexistente). La línea se marca con un estado "Error de Validación" y no se procesa para creación en Oracle.
  3. Usuario (Angular): Visualiza el estado del archivo como "Procesado con Errores" y la línea específica con "Error de Validación", junto con el detalle del error.

Escenario 4: Procesamiento con Errores en Creación de Pedido y Reintentos (con State Machine)

  1. Los pasos 1-4 del Escenario 1 (o equivalentes del Escenario 2) ocurren, y las líneas son "Validadas" (estado inicial relevante para la SM de creación o un estado previo que transita a validación).
  2. Sistema (Spring Batch - Creación de Pedido envía evento a State Machine):
    • Para una línea "Validada", se envía un evento ATTEMPT_ORACLE_CREATION a su instancia de State Machine.
  3. Sistema (State Machine):
    • Transita al estado CREATING_IN_ORACLE.
    • Acción de Estado: Intenta ingresar la línea de pedido en Oracle Fusion.
    • Si la API de Oracle devuelve éxito:
      • Transita a ORACLE_CREATION_SUCCESSFUL.
    • Si la API de Oracle devuelve un error retryable:
      • Transita a ORACLE_CREATION_FAILED_RETRYABLE, incrementa contador de reintentos.
  4. Sistema (State Machine - Reintentos):
    • Si está en ORACLE_CREATION_FAILED_RETRYABLE y retry_count < MAX_RETRIES, un mecanismo (scheduler o el mismo batch) puede enviar un evento RETRY_ORACLE_CREATION.
    • La State Machine transita de nuevo a CREATING_IN_ORACLE y reintenta.
    • Si retry_count >= MAX_RETRIES o el error es no retryable:
      • Transita a ORACLE_CREATION_FAILED_TERMINAL.
  5. Sistema (State Machine - Acción de Estado Terminal):
    • Si transita a ORACLE_CREATION_FAILED_TERMINAL, se dispara una acción para generar una notificación.
  6. Usuario (Angular):
    • Visualiza el estado de la línea según el estado actual en la State Machine (ej. "Fallido Max Reintentos", "Éxito") y el número de intentos. Diagramas de Caso de Uso:

3.3 ORQUESTACION y COMUNICACION

info

Arquitectura basada en eventos con GCP Pub/Sub

La idea principal es que, en lugar de que los procesos Spring Batch consulten la base de datos para encontrar trabajo (líneas en ciertos estados), reaccionarán a mensajes publicados en tópicos de GCP Pub/Sub. La State Machine, o las acciones que esta desencadena, también publicarán eventos a estos tópicos cuando ocurran transiciones significativas.

3.3.1 Proceso Post-DELTA (Publicador)

  • Después de que DELTA parsea un archivo y almacena las líneas en file_lines (con sm_state = 'NEW_LINE'), este proceso (o un nuevo microservicio/función) publicará un mensaje por cada line_id a un tópico indicando que la línea está lista para validación.

3.3.2 Spring Batch - Validación (Suscriptor y Actor SM)

  • Se suscribirá al tópico de "líneas listas para validación".
  • Al recibir un mensaje, obtendrá el line_id y enviará el evento EV_VALIDATE al OrderLineStateMachineManager para esa línea.

3.3.3 Spring State Machine Actions (Publicador)

  • Cuando una línea transite a VALIDATED, una acción de la SM publicará un mensaje al tópico "líneas validadas".
  • Cuando una línea transite a PENDING_RETRY, una acción de la SM publicará un mensaje al tópico "líneas pendientes de reintento".
  • Cuando una línea llegue a un estado terminal (ORACLE_CREATION_SUCCESSFUL o ORACLE_CREATION_FAILED_TERMINAL), se deberá publicar a un tópico de "líneas completadas".

3.3.4 Spring Batch - Creación/Reintento (Suscriptor y Actor SM)

  • Se suscribirá al tópico de "líneas validadas". Al recibir un mensaje, enviará EV_CREATE_IN_ORACLE a la SM correspondiente.
  • Se suscribirá al tópico de "líneas pendientes de reintento". Al recibir un mensaje, enviará EV_RETRY_ORACLE_CREATION a la SM correspondiente.

3.3.5 Apache Camel

  • No interactúa directamente con la orquestación de líneas vía Pub/Sub, pero el proceso Post-DELTA sí.

Esta arquitectura permite una mayor reactividad, desacoplamiento entre componentes y mejor escalabilidad horizontal, al adoptar un patrón event-driven moderno sobre GCP.

3.4 GCP Pub/Sub - Tópicos y Suscripciones

3.4.1 GCP Pub/Sub - Tópicos y Suscripciones

Se deben definir los siguientes tópicos en GCP Pub/Sub:

  • edi-line-for-validation-topic: Para mensajes que indican que una nueva file_line está lista para ser validada.
  • edi-line-validated-topic: Para mensajes que indican que una file_line ha sido validada exitosamente.
  • edi-line-oracle-retry-topic: Para mensajes que indican que una file_line falló en la creación en Oracle pero es elegible para reintento.
  • edi-line-processing-completed-topic: Para notificar la finalización (éxito o fallo terminal) del procesamiento de una línea.
  • edi-line-notification-request-topic: Para desacoplar el envío de notificaciones; la SM publicaría aquí y un servicio de notificación se suscribiría.
note

Nota: Para cada tópico, se crearán las suscripciones correspondientes para los servicios consumidores (como Spring Batch).


3.4.2 Proceso Post-DELTA (o Nuevo Componente Publicador)

  • Responsabilidad: Después de que DELTA inserte las líneas en file_lines con sm_state = 'NEW_LINE':
    • Iterar sobre cada line_id recién creada.
    • Publicar un mensaje JSON en edi-line-for-validation-topic para cada line_id.
  • Tecnología: Puede ser una extensión de DELTA, un script, una Cloud Function o un microservicio Spring Boot.
  • Dependencias: GCP Pub/Sub client library.

3.4.3 Spring Batch - Proceso de Validación

  • Trigger: Ya no se usará ItemReader que consulta por sm_state = 'NEW_LINE'.
  • Nuevo ItemReader (o Listener):
    • Escucha mensajes de edi-line-for-validation-topic.
    • Extrae el line_id al recibir el mensaje.
  • ItemProcessor:
    • Recibe line_id (y otros datos si aplica).
    • Llama a orderLineStateMachineManager.sendEvent(line_id, "EV_VALIDATE").
  • Dependencias:
    • GCP Pub/Sub client library
    • Spring Cloud Stream (recomendado)

3.4.4 Spring State Machine (OrderLineStateMachineManager)

Acciones de Estado o Listeners de Transición:

  • Al transitar a S_VALIDATED:

    • Publicar mensaje a edi-line-validated-topic con el line_id.
    {
    "eventId": "uuid-string-for-event-1",
    "eventType": "LineReadyForValidation",
    "timestamp": "2025-06-04T10:00:00Z",
    "data": {
    "lineId": 12345,
    "fileId": 789,
    "lineNumberInFile": 10
    }
    }
  • Al transitar a S_PENDING_RETRY:

    • Publicar mensaje a edi-line-oracle-retry-topic con line_id y retry_count.
    {
    "eventId": "uuid-string-for-event-3",
    "eventType": "LineOracleCreationPendingRetry",
    "timestamp": "2025-06-04T10:15:00Z",
    "data": {
    "lineId": 12345,
    "fileId": 789,
    "currentRetryCount": 1,
    "lastAttemptError": "ORA-12345: Oracle specific temporary error"
    }
    }
    • Al transitar a S_ORACLE_CREATION_FAILED_TERMINAL:

      • Publicar mensaje a edi-line-notification-request-topic con detalles del evento.
        (Esto reemplaza una llamada directa a NotificationService, promoviendo el desacoplamiento).
      {
      "eventId": "uuid-string-for-event-4",
      "eventType": "NotificationRequest",
      "timestamp": "2025-06-04T10:25:00Z",
      "data": {
      "lineId": 12345,
      "fileId": 789,
      "fileName": "cliente_XYZ_pedido_1.edi",
      "notificationType": "ORACLE_CREATION_FAILED_TERMINAL",
      "recipientGroup": "EDI_SUPPORT_TEAM",
      "details": {
      "clientOrderReference": "PO-CLIENTE-001",
      "productSku": "SKU123",
      "finalRetryCount": 3,
      "errorMessage": "Exceeded max retries. Last error: ORA-54321: Permanent issue."
      }
      }
      }
  • Dependencias: GCP Pub/Sub client library.


3.4.5 Spring Batch - Proceso de Creación/Reintento

  • Trigger: Ya no se usará ItemReader que consulta sm_state = 'VALIDATED' o PENDING_RETRY.

  • Nuevo ItemReader (o Listener):

    • Escucha de:
      • edi-line-validated-topic
      • edi-line-oracle-retry-topic
    • Puede ser un listener único que diferencia por origen del mensaje, o listeners separados.
    {
    "eventId": "uuid-string-for-event-2",
    "eventType": "LineValidatedSuccessfully",
    "timestamp": "2025-06-04T10:05:00Z",
    "data": {
    "lineId": 12345,
    "fileId": 789
    }
    }
  • ItemProcessor:

    • Si el mensaje proviene de edi-line-validated-topic:
      • Enviar evento EV_CREATE_IN_ORACLE.
    • Si el mensaje proviene de edi-line-oracle-retry-topic:
      • Enviar evento EV_RETRY_ORACLE_CREATION.
  • Dependencias:

    • GCP Pub/Sub client library
    • Spring Cloud Stream

Diagrama de orquestación


3.4 DIAGRAMA DE CONTEXTO

  • Parte 1: Integración y procesamiento con Apache Camel
  • Parte 2: Integración y procesamiento con Apache Camel
  • Parte 3: Aplicación DELTA y parseo de datos
  • Parte 4: Validación y creación de pedidos con Spring Batch
  • Parte 5: Visualización y notificaciones

4. VISIÓN GENERAL DE LA ARQUITECTURA

La Arquitectura del sistema se describe en 3 principales vistas: una vista física, una vista lógica y una vista de los principales componentes o drivers del sistema.

4.1 CAPA DE LA VISTA FÍSICA

El diagrama representa una posible distribución de componentes en servidores lógicos o físicos/virtuales.

4.2 CAPA DE LA VISTA LÓGICA

Este diagrama muestra el flujo de datos entre los componentes lógicos desarrollados

4.2.1 DIAGRAMAS DE SECUENCIA

1. Carga y Procesamiento Inicial de Archivo SFTP

2: Carga de Archivo (SOAP) y Procesamiento Inicial

3. Validación de lineas de pedido

4. Creación de pedidos en Oracle Fusion (con reintentos)

5: Visualización de Estados en Angular

6: Diagrama General de EDI


5. INTERACCIONES Y FLUJOS DE DATOS

Entidades Principales:

  • processed_files: Almacena información de cada archivo EDI/SOAP recibido .
  • file_lines: Almacena cada línea individual (pedido) parseada de un archivo.
  • orders_encabezado_full: Representa la cabecera o encabezado de un pedido recibido vía EDI.
  • orders_detalle_full: Contiene el detalle o partidas de productos por cada orden.
  • processing_status_logs: (Opcional, para una auditoría muy detallada de cada paso, pero para simplificar, integraremos estados clave en processed_files y file_lines).
  • notification_logs: Para registrar las notificaciones enviadas.
  • ALP_TMP_REQ_HEADER_INTERFACE: Registra la información del encabezado de la requisición proveniente del sistema Tetrapac.
  • ALP_TMP_REQUISITIONS_INTERFACE: Registra las líneas de la requisición registradas en el sistema Tetrapac.

Relaciones:

  • Un processed_file puede tener muchas file_lines. (1 a N)
  • Una notification_log puede estar opcionalmente asociada a un processed_file o a una file_line

5.1 Diccionario de Datos

Este diccionario describe las tablas y columnas de la base de datos PostgreSQL diseñada para el sistema de integración de pedidos.


Tabla: cat_file_sources

Almacena los posibles orígenes de los archivos.

ColumnaTipo de DatoRestriccionesDescripción
source_idINTEGERPRIMARY KEYIdentificador único del origen del archivo.
nameVARCHARUNIQUE, NOT NULLNombre del origen (ej. 'SFTP', 'SOAP').
descriptionTEXTNULLABLEDescripción adicional del origen (opcional).

Tabla: cat_generic_processing_statuses

Almacena los estados genéricos para diferentes etapas de procesamiento (ej. registro de metadatos, parseo).

ColumnaTipo de DatoRestriccionesDescripción
status_idINTEGERPRIMARY KEYIdentificador único del estado de procesamiento.
nameVARCHARUNIQUE, NOT NULLNombre del estado (ej. 'PENDING', 'IN_PROGRESS', 'SUCCESS', 'ERROR').
descriptionTEXTNULLABLEDescripción adicional del estado (opcional).

Tabla: cat_file_overall_statuses

Almacena los estados generales que puede tener un archivo durante todo su ciclo de vida.

ColumnaTipo de DatoRestriccionesDescripción
status_idINTEGERPRIMARY KEYIdentificador único del estado general del archivo.
nameVARCHARUNIQUE, NOT NULLNombre del estado (ej. 'RECEIVED', 'PROCESSING', 'COMPLETED_SUCCESS', etc.).
descriptionTEXTNULLABLEDescripción adicional del estado (opcional).

Tabla: cat_line_validation_statuses

Almacena los posibles estados de validación para una línea de archivo.

ColumnaTipo de DatoRestriccionesDescripción
status_idINTEGERPRIMARY KEYIdentificador único del estado de validación de línea.
nameVARCHARUNIQUE, NOT NULLNombre del estado (ej. 'PENDING', 'VALIDATED', 'ERROR').
descriptionTEXTNULLABLEDescripción adicional del estado (opcional).

Tabla: cat_line_oracle_creation_statuses

Almacena los posibles estados para la creación de una línea de archivo como pedido en Oracle.

ColumnaTipo de DatoRestriccionesDescripción
status_idINTEGERPRIMARY KEYIdentificador único del estado de creación en Oracle.
nameVARCHARUNIQUE, NOT NULLNombre del estado (ej. 'NOT_PROCESSED', 'PENDING_CREATION', 'SUCCESS', etc.).
descriptionTEXTNULLABLEDescripción adicional del estado (opcional).

Tabla: cat_notification_types

Almacena los diferentes tipos de notificaciones que el sistema puede generar.

ColumnaTipo de DatoRestriccionesDescripción
type_idINTEGERPRIMARY KEYIdentificador único del tipo de notificación.
nameVARCHARUNIQUE, NOT NULLNombre del tipo de notificación (ej. 'MAX_RETRY_FAILURE_ORACLE_CREATION').
descriptionTEXTNULLABLEDescripción adicional del tipo (opcional).

Tabla: cat_notification_log_statuses

Almacena los posibles estados para un log de notificación.

ColumnaTipo de DatoRestriccionesDescripción
status_idINTEGERPRIMARY KEYIdentificador único del estado del log de notificación.
nameVARCHARUNIQUE, NOT NULLNombre del estado (ej. 'PENDING', 'SENT', 'FAILED_TO_SEND').
descriptionTEXTNULLABLEDescripción adicional del estado (opcional).

Tabla: processed_files

Almacena información de cada archivo EDI/SOAP recibido y su estado general de procesamiento.

ColumnaTipo de DatoRestriccionesDescripción
file_idBIGSERIALPRIMARY KEYIdentificador único del archivo procesado.
file_nameVARCHAR(255)NOT NULLNombre original del archivo recibido.
received_atTIMESTAMPTZDEFAULT CURRENT_TIMESTAMP, NOT NULLFecha y hora en que el archivo fue recibido por el sistema.
source_idINTEGERNOT NULL, FK REFERENCES cat_file_sources(source_id)ID del origen del archivo (ej. SFTP, SOAP).
sftp_path_incomingVARCHAR(1024)NULLABLERuta en el SFTP donde se encontró el archivo (si aplica).
sftp_path_outcomingVARCHAR(1024)NULLABLERuta en el SFTP a donde se movió el archivo después del primer paso (si aplica).
file_hashVARCHAR(64)NULLABLEHash del archivo (ej. SHA-256) para detección de duplicados o verificación de integridad (opcional).
metadata_registration_status_idINTEGERNOT NULL, FK REFERENCES cat_generic_processing_statuses(status_id)ID del estado del proceso de registro de metadatos.
metadata_registration_errorTEXTNULLABLEDetalles del error si falló el registro de metadatos.
parsing_status_idINTEGERNOT NULL, FK REFERENCES cat_generic_processing_statuses(status_id)ID del estado del proceso de parseo del archivo.
parsing_errorTEXTNULLABLEDetalles del error si falló el parseo.
total_linesINTEGERNULLABLENúmero total de líneas detectadas en el archivo después del parseo.
successful_linesINTEGERDEFAULT 0, NOT NULLContador de líneas del archivo que fueron creadas exitosamente como pedidos en Oracle.
failed_linesINTEGERDEFAULT 0, NOT NULLContador de líneas del archivo que fallaron definitivamente (validación o creación en Oracle).
overall_status_idINTEGERNOT NULL, FK REFERENCES cat_file_overall_statuses(status_id)ID del estado general del procesamiento del archivo.
last_updated_atTIMESTAMPTZDEFAULT CURRENT_TIMESTAMP, NOT NULLFecha y hora de la última actualización del registro. (Actualizado por trigger).
created_atTIMESTAMPTZDEFAULT CURRENT_TIMESTAMP, NOT NULLFecha y hora de creación del registro.
CONSTRAINT uq_file_name_received_at UNIQUE (file_name, received_at)Permite reprocesar archivos con el mismo nombre si se reciben en momentos distintos.

Tabla: file_lines

Almacena cada línea individual parseada de un archivo, representando un pedido potencial, y su estado detallado.

ColumnaTipo de DatoRestriccionesDescripción
line_idBIGSERIALPRIMARY KEYIdentificador único de la línea del archivo.
file_idBIGINTNOT NULL, FK REFERENCES processed_files(file_id) ON DELETE CASCADEID del archivo al que pertenece esta línea.
line_number_in_fileINTEGERNOT NULLNúmero secuencial de la línea dentro de su archivo original.
client_order_referenceVARCHAR(100)NULLABLEReferencia del pedido del cliente (ej. número de orden de compra del cliente).
product_skuVARCHAR(50)NULLABLESKU o código del producto.
quantityNUMERIC(10,2)NULLABLECantidad del producto solicitado.
parsed_dataJSONBNULLABLEAlmacena cualquier otro dato relevante parseado de la línea en formato JSON.
sm_stateVARCHAR(50)NOT NULL
validation_status_idINTEGERNOT NULL, FK REFERENCES cat_line_validation_statuses(status_id)ID del estado de validación de la línea (contra APIs de Oracle, reglas de negocio).
validation_error_detailsTEXTNULLABLEDetalles del error si la validación de la línea falló.
oracle_creation_status_idINTEGERNOT NULL, FK REFERENCES cat_line_oracle_creation_statuses(status_id)ID del estado de creación de esta línea como pedido en Oracle Fusion.
oracle_order_idVARCHAR(100)NULLABLEID del pedido generado en Oracle Fusion si la creación fue exitosa.
oracle_api_error_detailsTEXTNULLABLEDetalles del error devuelto por la API de Oracle si la creación del pedido falló.
retry_countINTEGERDEFAULT 0, NOT NULLNúmero de reintentos realizados para crear el pedido en Oracle.
last_oracle_attempt_atTIMESTAMPTZNULLABLEFecha y hora del último intento de creación del pedido en Oracle.
last_updated_atTIMESTAMPTZDEFAULT CURRENT_TIMESTAMP, NOT NULLFecha y hora de la última actualización del registro. (Actualizado por trigger).
created_atTIMESTAMPTZDEFAULT CURRENT_TIMESTAMP, NOT NULLFecha y hora de creación del registro.
CONSTRAINT uq_file_line UNIQUE (file_id, line_number_in_file)Asegura que el número de línea sea único dentro de cada archivo.

📦 Tabla: orders_encabezado_full

Representa la cabecera o encabezado de un pedido recibido vía EDI. Almacena metadatos del pedido como proveedor, comprador, fechas relevantes y condiciones comerciales.

ColumnaTipo de DatoRestriccionesDescripción
ARCHIVO_ORIGENVARCHAR2(100)NULLABLENombre del archivo EDI de donde provino el pedido.
NUMERO_PEDIDOVARCHAR2(30)PRIMARY KEY (lógico)Identificador único del pedido.
FECHA_ENTREGATIMESTAMP(6)NULLABLEFecha comprometida de entrega.
FECHA_CREACIONTIMESTAMP(6)NULLABLEFecha en que se generó el pedido.
FECHA_PEDIDOTIMESTAMP(6)NULLABLEFecha en que el cliente realizó el pedido.
FECHA_CANCELACIONTIMESTAMP(6)NULLABLEFecha de cancelación, si aplica.
NUMERO_PROVEEDORVARCHAR2(20)NULLABLECódigo interno del proveedor.
CODIGO_EAN_PROVEEDORVARCHAR2(35)NULLABLECódigo EAN del proveedor.
NOMBRE_PROVEEDORVARCHAR2(35)NULLABLENombre del proveedor.
NUMERO_COMPRADORVARCHAR2(20)NULLABLECódigo interno del comprador.
CODIGO_EAN_COMPRADORVARCHAR2(35)NULLABLECódigo EAN del comprador.
NOMBRE_COMPRADORVARCHAR2(35)NULLABLENombre del comprador.
NUMERO_SUCURSALVARCHAR2(20)NULLABLENúmero o código de la sucursal receptora.
CODIGO_EAN_SUCURSALVARCHAR2(35)NULLABLECódigo EAN de la sucursal receptora.
NOMBRE_SUCURSALVARCHAR2(35)NULLABLENombre de la sucursal receptora.
FECHA_RECEPCIONTIMESTAMP(6)NULLABLEFecha en que se espera la recepción.
MONEDAVARCHAR2(4)NULLABLETipo de moneda del pedido (ej. MXN, USD).
PLAZO_PAGOVARCHAR2(5)NULLABLEDías de crédito pactados.
CODIGO_EAN_LUGAR_ENTREGAVARCHAR2(35)NULLABLECódigo EAN del punto de entrega.
NOMBRE_LUGAR_ENTREGAVARCHAR2(60)NULLABLENombre del lugar de entrega.
DEPARTAMENTOVARCHAR2(12)NULLABLEDepartamento que origina el pedido.
REFERENCIAVARCHAR2(12)NULLABLECampo de referencia libre o interna.
TERMINOS_ENTREGA_TRANSPORTEVARCHAR2(20)NULLABLETérminos de entrega (Incoterms u otros).
IMPORTE_TOTALVARCHAR2(20)NULLABLEImporte total del pedido.
TOTAL_PARTIDASVARCHAR2(20)NULLABLENúmero total de líneas o ítems del pedido.
FECHA_TRANSACCIONTIMESTAMP(6)NULLABLEFecha en la que fue procesada la orden.
TIPO_ORDENVARCHAR2(50)NULLABLETipo de orden (ej. regular, express, etc.).
CLIENTEVARCHAR2(50)NULLABLEIdentificador del cliente EDI.
ESTATUSVARCHAR2(20)NULLABLEEstado actual de la orden.
TRANSFERIDOVARCHAR2(1)NULLABLEIndica si fue transferido a Oracle (Y/N).
CONTROL_EDIVARCHAR2(45)NULLABLEIdentificador de control EDI único.
FECHA_GENERACIONTIMESTAMP(6)NULLABLEFecha de generación del documento EDI.
FECHA_CONTROLTIMESTAMP(6)NULLABLEFecha de validación/control del documento.
TRUCK_NUMBERVARCHAR2(500)NULLABLENúmero de camión o referencia de transporte.
TIPO_EDIVARCHAR2(30)NULLABLETipo de mensaje EDI (ej. ORDERS, INVOIC, etc.).

📦 Tabla: orders_detalle_full

Contiene el detalle o partidas de productos por cada orden. Cada línea representa un artículo solicitado con información comercial y logística.

ColumnaTipo de DatoRestriccionesDescripción
NUMERO_PEDIDOVARCHAR2(30)NOT NULL, FK lógicoReferencia al número de pedido (orders_encabezado_full.NUMERO_PEDIDO).
DESCRIPCION1VARCHAR2(100)NULLABLEDescripción principal del producto.
DESCRIPCION2VARCHAR2(100)NULLABLEDescripción secundaria o adicional.
CANTIDAD_PEDIDAVARCHAR2(10)NULLABLECantidad pedida del artículo.
PRECIO_UNITARIOVARCHAR2(15)NULLABLEPrecio unitario acordado.
MONTO_TOTAL_PARTIDAVARCHAR2(15)NULLABLEMonto total de la línea (cantidad × precio).
CODIGO_EAN_ARTICULOVARCHAR2(14)NULLABLECódigo EAN del producto.
CODIGO_ARTICULO_PROVEEDORVARCHAR2(20)NULLABLECódigo interno del proveedor para el producto.
CODIGO_ARTICULO_COMPRADORVARCHAR2(20)NULLABLECódigo interno del comprador para el producto.
PIEZAS_EMPAQUEVARCHAR2(5)NULLABLENúmero de piezas por empaque o caja.
CONTROL_EDIVARCHAR2(20)NULLABLEIdentificador EDI para control de trazabilidad.
FECHA_TRANSACCIONTIMESTAMP(6)NULLABLEFecha en que se procesó esta línea.
HORA_TRANSACCIONTIMESTAMP(6)NULLABLEHora de la transacción, si está separada.
CLIENTEVARCHAR2(20)NULLABLECódigo del cliente para esta línea.
TRANSFERIDOVARCHAR2(1)NULLABLEIndicador si ya fue transferido a Oracle.
ID_DETALLENUMBERPRIMARY KEY (lógico)Identificador único de la línea.
UNIDAD_MEDIDA_DISVARCHAR2(6)NULLABLEUnidad de medida para distribución.
CODIGO_ARTICULOVARCHAR2(20)NULLABLECódigo del artículo en el sistema.
CANTIDAD_PENDIENTEVARCHAR2(10)NULLABLECantidad restante por entregar.
PAQUETEVARCHAR2(30)NULLABLEDescripción del paquete o agrupador.

Tabla: notification_logs

Registra todas las notificaciones enviadas por el sistema.

ColumnaTipo de DatoRestriccionesDescripción
notification_idBIGSERIALPRIMARY KEYIdentificador único del log de notificación.
file_idBIGINTNULLABLE, FK REFERENCES processed_files(file_id) ON DELETE SET NULLID del archivo relacionado con la notificación (opcional).
line_idBIGINTNULLABLE, FK REFERENCES file_lines(line_id) ON DELETE SET NULLID de la línea de archivo relacionada con la notificación (opcional).
notification_type_idINTEGERNOT NULL, FK REFERENCES cat_notification_types(type_id)ID del tipo de notificación enviada.
recipientVARCHAR(255)NOT NULLDestinatario de la notificación (ej. email, cola de mensajes, webhook URL).
messageTEXTNOT NULLContenido del mensaje de la notificación.
sent_atTIMESTAMPTZDEFAULT CURRENT_TIMESTAMP, NOT NULLFecha y hora en que la notificación fue (o intentó ser) enviada.
notification_log_status_idINTEGERNOT NULL, FK REFERENCES cat_notification_log_statuses(status_id)ID del estado del envío de la notificación.
error_messageTEXTNULLABLEMensaje de error si el envío de la notificación falló.

Tabla: ALP_TMP_REQUISITIONS_INTERFACE

Registra la información de requisiciones en el sistema.

ColumnaTipo de DatoRestriccionesDescripción
INTERFACE_IDVARCHARNOT NULLIdentificador único de la interfaz.
TRANSACCIONVARCHARNULLABLECódigo de transacción asociado.
ORDEN_COMPRAVARCHARNULLABLENúmero de orden de compra.
RFCVARCHARNULLABLERFC del proveedor o solicitante.
INTERFACE_SOURCE_CODEVARCHARNULLABLECódigo de origen de la interfaz.
SOURCE_TYPE_CODEVARCHARNULLABLETipo de fuente de la información.
REQUISITION_TYPEVARCHARNULLABLETipo de requisición.
DESTINATION_TYPE_CODEVARCHARNULLABLETipo de destino de la requisición.
QUANTITYNUMERICNULLABLECantidad solicitada.
UNIT_PRICENUMERICNULLABLEPrecio unitario del ítem.
AUTHORIZATION_STATUSVARCHARNULLABLEEstado de autorización de la requisición.
BATCH_IDVARCHARNULLABLEIdentificador del lote o batch.
NOTE_TO_APPROVERVARCHARNULLABLENota dirigida al aprobador.
PREPARER_IDVARCHARNULLABLEIdentificador del usuario que prepara la requisición.
HEADER_DESCRIPTIONVARCHARNULLABLEDescripción del encabezado de la requisición.
HEADER_ATTRIBUTE_CATEGORYVARCHARNULLABLECategoría de atributos del encabezado.
HEADER_ATTRIBUTE8VARCHARNULLABLEAtributo adicional 8 del encabezado.
HEADER_ATTRIBUTE9VARCHARNULLABLEAtributo adicional 9 del encabezado.
NOTE_TO_BUYERVARCHARNULLABLENota dirigida al comprador.
ITEM_SEGMENT1VARCHARNULLABLESegmento 1 del ítem.
CHARGE_ACCOUNT_IDVARCHARNULLABLECuenta contable asociada.
UOM_CODEVARCHARNULLABLEUnidad de medida del ítem.
REFERENCE_NUMVARCHARNULLABLENúmero de referencia adicional.
DESTINATION_ORGANIZATION_IDVARCHARNULLABLEID de la organización destino.
DELIVER_TO_LOCATION_IDVARCHARNULLABLEID del lugar de entrega.
DELIVER_TO_REQUESTOR_IDVARCHARNULLABLEID del solicitante de la entrega.
DELIVERY_NUMBERVARCHARNULLABLENúmero de entrega asociado.
LOTEVARCHARNULLABLELote del producto.
SUGGESTED_VENDOR_IDVARCHARNULLABLEID del proveedor sugerido.
SUGGESTED_VENDOR_SITE_IDVARCHARNULLABLEID del sitio del proveedor sugerido.
NEED_BY_DATETIMESTAMPNULLABLEFecha en que se necesita la requisición.
DOCUMENT_DATETIMESTAMPNULLABLEFecha del documento.
CURRENCY_CODEVARCHARNULLABLECódigo de moneda.
ORG_IDVARCHARNULLABLEIdentificador de la organización.
STATUSVARCHARNULLABLEEstado de la requisición.
ERROR_DESCRIPTIONVARCHARNULLABLEDescripción de error si aplica.
TIPO_DOCUMENTOVARCHARNULLABLETipo de documento.
USER_PREPARERVARCHARNULLABLEUsuario que preparó la requisición.
GLNVARCHARNULLABLEGlobal Location Number.
ES_ULTIMA_ENTREGAVARCHARNULLABLEIndica si es la última entrega.
SSCCVARCHARNULLABLECódigo de contenedor de envío (Serial Shipping Container Code).
CREATED_BYVARCHARNULLABLEUsuario que creó el registro.
CREATION_DATETIMESTAMPNULLABLEFecha de creación del registro.
LAST_UPDATED_BYVARCHARNULLABLEUsuario que realizó la última actualización.
LAST_UPDATE_DATETIMESTAMPNULLABLEFecha de la última actualización.
LIN_SELECCIONADAVARCHARNULLABLELínea seleccionada.
QUANTITY2NUMERICNULLABLECantidad adicional.

Tabla: ALP_TMP_REQ_HEADER_INTERFACE

Registra la información de encabezados de requisiciones en el sistema.

ColumnaTipo de DatoRestriccionesDescripción
INTERFACE_IDVARCHARNOT NULLIdentificador único de la interfaz.
TRANSACCIONVARCHARNULLABLECódigo de transacción asociado.
ORDEN_COMPRAVARCHARNULLABLENúmero de orden de compra.
RFCVARCHARNULLABLERFC del proveedor o solicitante.
HEADER_ATTRIBUTE8VARCHARNULLABLEAtributo adicional 8 del encabezado.
DELIVER_TO_LOCATION_IDVARCHARNULLABLEID del lugar de entrega.
SUGGESTED_VENDOR_IDVARCHARNULLABLEID del proveedor sugerido.
DOCUMENT_DATETIMESTAMPNULLABLEFecha del documento.
ORG_IDVARCHARNULLABLEIdentificador de la organización.
USER_PREPARERVARCHARNULLABLEUsuario que preparó la requisición.
GLNVARCHARNULLABLEGlobal Location Number.
ESTATUSVARCHARNULLABLEEstado del encabezado de la requisición.
ERROR_DESCRIPTIONVARCHARNULLABLEDescripción de error si aplica.
TIPO_DOCUMENTOVARCHARNULLABLETipo de documento.
CREATED_BYVARCHARNULLABLEUsuario que creó el registro.
CREATION_DATETIMESTAMPNULLABLEFecha de creación del registro.
LAST_UPDATED_BYVARCHARNULLABLEUsuario que realizó la última actualización.
LAST_UPDATE_DATETIMESTAMPNULLABLEFecha de la última actualización.

6. ORQUESTACIÓN CON SPRING STATE MACHINE

Para gestionar el ciclo de vida de cada línea de pedido (file_line) de manera robusta y centralizada, se implementará una máquina de estados utilizando Spring State Machine. Cada línea de pedido tendrá su propia instancia de la máquina de estados.

6.1 Propósito y Justificación

  • Centralización de la Lógica de Flujo: Define claramente todos los posibles estados y transiciones para una línea de pedido.
  • Manejo de Eventos: El procesamiento avanza mediante eventos que disparan transiciones.
  • Acciones y Guardias: Permite ejecutar lógica de negocio (acciones) al entrar/salir de estados o durante transiciones, y condiciones (guardias) para permitir o denegar transiciones.
  • Resiliencia: Facilita la implementación de reintentos y manejo de errores.
  • Mantenibilidad: Simplifica la comprensión y modificación del flujo de procesamiento.

6.2 Modelo de Estados para file_line

La máquina de estados gestionará el ciclo de vida de una línea de pedido desde que es parseada hasta que es procesada (o falla definitivamente) en Oracle.

6.3 Estados (States - S)

Estados de la Máquina de Estados (sm_state)

Estado (sm_state)Descripción
NEW_LINELínea recién parseada por DELTA, lista para validación.
VALIDATINGEn proceso de validación de datos contra Oracle Fusion APIs.
VALIDATEDLínea validada exitosamente, lista para creación en Oracle.
VALIDATION_FAILEDFalló la validación de datos. Estado terminal para esta línea.
CREATING_IN_ORACLEEn proceso de creación del pedido en Oracle Fusion. Se incrementa retry_count (o attempt_count) aquí.
ORACLE_CREATION_SUCCESSFULPedido creado exitosamente en Oracle Fusion. Estado terminal.
PENDING_RETRYFalló la creación en Oracle, pero es reintentable y quedan intentos.
ORACLE_CREATION_FAILED_TERMINALFalló la creación en Oracle tras todos los reintentos, o por error no reintentable. Estado terminal.

6.4 Eventos (Events - EV)

EventoDisparadorDescripción
EV_VALIDATESpring Batch (Proceso de Validación)Inicia la validación de la línea.
EV_VALIDATION_SUCCESSLógica interna de la SM (resultado de la acción de validación)La validación fue exitosa.
EV_VALIDATION_FAILURELógica interna de la SM (resultado de la acción de validación)La validación falló.
EV_CREATE_IN_ORACLESpring Batch (Proceso de Creación de Pedidos)Inicia la creación del pedido en Oracle.
EV_ORACLE_CREATION_SUCCESSLógica interna de la SM (resultado de la API de Oracle_

6.5 Acciones y Guardias

Acciones (Entry/Exit Actions)

  • S_VALIDATING (on entry):
    Invocar servicio de validación de Oracle Fusion.
    Actualizar validation_error_details si falla.

  • S_CREATING_IN_ORACLE (on entry):
    Incrementar retry_count.
    Llamar a la API de creación de pedidos de Oracle Fusion.
    Actualizar oracle_api_error_details si falla y oracle_order_id si tiene éxito.
    Actualizar last_oracle_attempt_at.

  • S_ORACLE_CREATION_FAILED_TERMINAL (on entry):
    Invocar Notification_Service.

Guardias (Transition Guards)

  • Transición CREATING_IN_ORACLEPENDING_RETRY:
    isRetryableErrorFromOracle() && context.getExtendedState().getVariables().get("retry_count") < MAX_RETRIES

  • Transición CREATING_IN_ORACLEORACLE_CREATION_FAILED_TERMINAL:
    !isRetryableErrorFromOracle() || context.getExtendedState().getVariables().get("retry_count") >= MAX_RETRIES


6.6 Persistencia de la Máquina de Estados

  • Se utilizará un StateMachinePersister de Spring State Machine
    (por ejemplo, RepositoryStateMachinePersist con Spring Data JPA)
    para guardar y restaurar el estado de cada instancia de la máquina de estados.

  • El estado (sm_state) y variables relevantes (retry_count, oracle_order_id, errores)
    se persistirán en la tabla file_lines.

  • Cada line_id servirá como identificador único para su instancia de máquina de estados.


6.7 Componente State Machine Manager

  • Un bean de Spring llamado OrderLineStateMachineManager encapsulará la lógica para:

    • Obtener o crear instancias de SM.
    • Enviar eventos.
    • Gestionar la persistencia.
  • Los jobs de Spring Batch interactuarán con este manager para procesar las líneas:

    • Job de Validación:
      Leerá líneas en NEW_LINE, para cada una obtendrá su SM y enviará el evento EV_VALIDATE.

    • Job de Creación de Pedidos:
      Leerá líneas en VALIDATED, para cada una obtendrá su SM y enviará el evento EV_CREATE_IN_ORACLE.

    • Job de Reintentos (Opcional):
      Podría haber un job dedicado que lea líneas en PENDING_RETRY y envíe el evento EV_RETRY_ORACLE_CREATION.
      Esta lógica también podría estar en el job de creación o ser gestionada por un scheduler dentro de la SM.

6.8 Diagrama de Componentes de Orquestación


7. Vista logíca de interacción Portal Web y API REST

7.1 Carga Inicial del Dashboard

Este diagrama muestra lo que sucede cuando el usuario carga por primera vez la vista del Dashboard.

7.2 Carga y Filtro en "Consulta de Archivos"

Este diagrama muestra la carga inicial de la lista de archivos y una acción de filtrado por parte del usuario.

7.3 Ver Detalles de un Archivo (Líneas del Archivo)

Este diagrama muestra la interacción cuando el usuario hace clic en "Ver Detalles" para un archivo específico.

11. Anexos

  • Diagrama de despliegue (hld-diagrama-despliegue.png)
  • Especificaciones OpenAPI de las APIs expuestas
  • Links a documentación técnica adicional