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:
- 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í.
- 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.
- 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.
- 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
- Cliente: Deposita un archivo EDI en la carpeta "incoming" del SFTP.
- 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.
- 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.
- 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".
- 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".
- 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
- Cliente: Envía un archivo (contenido EDI) a través del servicio web SOAP.
- Sistema (Servicio SOAP): Recibe el archivo y lo deposita en la carpeta "incoming" del SFTP.
- Los pasos 2 al 6 del Escenario 1 se ejecutan de la misma manera.
Escenario 3: Procesamiento con Errores de Validación de Datos
- El flujo inicial (pasos 1-3 del Escenario 1 o 1-2 del Escenario 2) ocurre.
- 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.
- 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)
- 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).
- 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_CREATIONa su instancia de State Machine.
- Para una línea "Validada", se envía un evento
- 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.
- Transita a
- Si la API de Oracle devuelve un error retryable:
- Transita a
ORACLE_CREATION_FAILED_RETRYABLE, incrementa contador de reintentos.
- Transita a
- Transita al estado
- Sistema (State Machine - Reintentos):
- Si está en
ORACLE_CREATION_FAILED_RETRYABLEyretry_count < MAX_RETRIES, un mecanismo (scheduler o el mismo batch) puede enviar un eventoRETRY_ORACLE_CREATION. - La State Machine transita de nuevo a
CREATING_IN_ORACLEy reintenta. - Si
retry_count >= MAX_RETRIESo el error es no retryable:- Transita a
ORACLE_CREATION_FAILED_TERMINAL.
- Transita a
- Si está en
- 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.
- Si transita a
- 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
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(consm_state = 'NEW_LINE'), este proceso (o un nuevo microservicio/función) publicará un mensaje por cadaline_ida 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_idy enviará el eventoEV_VALIDATEalOrderLineStateMachineManagerpara 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_SUCCESSFULoORACLE_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_ORACLEa la SM correspondiente. - Se suscribirá al tópico de "líneas pendientes de reintento". Al recibir un mensaje, enviará
EV_RETRY_ORACLE_CREATIONa 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 nuevafile_lineestá lista para ser validada.edi-line-validated-topic: Para mensajes que indican que unafile_lineha sido validada exitosamente.edi-line-oracle-retry-topic: Para mensajes que indican que unafile_linefalló 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.
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_linesconsm_state = 'NEW_LINE':- Iterar sobre cada
line_idrecién creada. - Publicar un mensaje JSON en
edi-line-for-validation-topicpara cadaline_id.
- Iterar sobre cada
- 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á
ItemReaderque consulta porsm_state = 'NEW_LINE'. - Nuevo ItemReader (o Listener):
- Escucha mensajes de
edi-line-for-validation-topic. - Extrae el
line_idal recibir el mensaje.
- Escucha mensajes de
- ItemProcessor:
- Recibe
line_id(y otros datos si aplica). - Llama a
orderLineStateMachineManager.sendEvent(line_id, "EV_VALIDATE").
- Recibe
- Dependencias:
GCP Pub/Sub client librarySpring 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-topiccon elline_id.
{"eventId": "uuid-string-for-event-1","eventType": "LineReadyForValidation","timestamp": "2025-06-04T10:00:00Z","data": {"lineId": 12345,"fileId": 789,"lineNumberInFile": 10}} - Publicar mensaje a
-
Al transitar a
S_PENDING_RETRY:- Publicar mensaje a
edi-line-oracle-retry-topicconline_idyretry_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-topiccon detalles del evento.
(Esto reemplaza una llamada directa aNotificationService, 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."}}} - Publicar mensaje a
- Publicar mensaje a
-
Dependencias:
GCP Pub/Sub client library.
3.4.5 Spring Batch - Proceso de Creación/Reintento
-
Trigger: Ya no se usará
ItemReaderque consultasm_state = 'VALIDATED'oPENDING_RETRY. -
Nuevo ItemReader (o Listener):
- Escucha de:
edi-line-validated-topicedi-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}} - Escucha de:
-
ItemProcessor:
- Si el mensaje proviene de
edi-line-validated-topic:- Enviar evento
EV_CREATE_IN_ORACLE.
- Enviar evento
- Si el mensaje proviene de
edi-line-oracle-retry-topic:- Enviar evento
EV_RETRY_ORACLE_CREATION.
- Enviar evento
- Si el mensaje proviene de
-
Dependencias:
GCP Pub/Sub client librarySpring 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.
| Columna | Tipo de Dato | Restricciones | Descripción |
|---|---|---|---|
source_id | INTEGER | PRIMARY KEY | Identificador único del origen del archivo. |
name | VARCHAR | UNIQUE, NOT NULL | Nombre del origen (ej. 'SFTP', 'SOAP'). |
description | TEXT | NULLABLE | Descripció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).
| Columna | Tipo de Dato | Restricciones | Descripción |
|---|---|---|---|
status_id | INTEGER | PRIMARY KEY | Identificador único del estado de procesamiento. |
name | VARCHAR | UNIQUE, NOT NULL | Nombre del estado (ej. 'PENDING', 'IN_PROGRESS', 'SUCCESS', 'ERROR'). |
description | TEXT | NULLABLE | Descripció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.
| Columna | Tipo de Dato | Restricciones | Descripción |
|---|---|---|---|
status_id | INTEGER | PRIMARY KEY | Identificador único del estado general del archivo. |
name | VARCHAR | UNIQUE, NOT NULL | Nombre del estado (ej. 'RECEIVED', 'PROCESSING', 'COMPLETED_SUCCESS', etc.). |
description | TEXT | NULLABLE | Descripción adicional del estado (opcional). |
Tabla: cat_line_validation_statuses
Almacena los posibles estados de validación para una línea de archivo.
| Columna | Tipo de Dato | Restricciones | Descripción |
|---|---|---|---|
status_id | INTEGER | PRIMARY KEY | Identificador único del estado de validación de línea. |
name | VARCHAR | UNIQUE, NOT NULL | Nombre del estado (ej. 'PENDING', 'VALIDATED', 'ERROR'). |
description | TEXT | NULLABLE | Descripció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.
| Columna | Tipo de Dato | Restricciones | Descripción |
|---|---|---|---|
status_id | INTEGER | PRIMARY KEY | Identificador único del estado de creación en Oracle. |
name | VARCHAR | UNIQUE, NOT NULL | Nombre del estado (ej. 'NOT_PROCESSED', 'PENDING_CREATION', 'SUCCESS', etc.). |
description | TEXT | NULLABLE | Descripción adicional del estado (opcional). |
Tabla: cat_notification_types
Almacena los diferentes tipos de notificaciones que el sistema puede generar.
| Columna | Tipo de Dato | Restricciones | Descripción |
|---|---|---|---|
type_id | INTEGER | PRIMARY KEY | Identificador único del tipo de notificación. |
name | VARCHAR | UNIQUE, NOT NULL | Nombre del tipo de notificación (ej. 'MAX_RETRY_FAILURE_ORACLE_CREATION'). |
description | TEXT | NULLABLE | Descripción adicional del tipo (opcional). |
Tabla: cat_notification_log_statuses
Almacena los posibles estados para un log de notificación.
| Columna | Tipo de Dato | Restricciones | Descripción |
|---|---|---|---|
status_id | INTEGER | PRIMARY KEY | Identificador único del estado del log de notificación. |
name | VARCHAR | UNIQUE, NOT NULL | Nombre del estado (ej. 'PENDING', 'SENT', 'FAILED_TO_SEND'). |
description | TEXT | NULLABLE | Descripción adicional del estado (opcional). |
Tabla: processed_files
Almacena información de cada archivo EDI/SOAP recibido y su estado general de procesamiento.
| Columna | Tipo de Dato | Restricciones | Descripción |
|---|---|---|---|
file_id | BIGSERIAL | PRIMARY KEY | Identificador único del archivo procesado. |
file_name | VARCHAR(255) | NOT NULL | Nombre original del archivo recibido. |
received_at | TIMESTAMPTZ | DEFAULT CURRENT_TIMESTAMP, NOT NULL | Fecha y hora en que el archivo fue recibido por el sistema. |
source_id | INTEGER | NOT NULL, FK REFERENCES cat_file_sources(source_id) | ID del origen del archivo (ej. SFTP, SOAP). |
sftp_path_incoming | VARCHAR(1024) | NULLABLE | Ruta en el SFTP donde se encontró el archivo (si aplica). |
sftp_path_outcoming | VARCHAR(1024) | NULLABLE | Ruta en el SFTP a donde se movió el archivo después del primer paso (si aplica). |
file_hash | VARCHAR(64) | NULLABLE | Hash del archivo (ej. SHA-256) para detección de duplicados o verificación de integridad (opcional). |
metadata_registration_status_id | INTEGER | NOT NULL, FK REFERENCES cat_generic_processing_statuses(status_id) | ID del estado del proceso de registro de metadatos. |
metadata_registration_error | TEXT | NULLABLE | Detalles del error si falló el registro de metadatos. |
parsing_status_id | INTEGER | NOT NULL, FK REFERENCES cat_generic_processing_statuses(status_id) | ID del estado del proceso de parseo del archivo. |
parsing_error | TEXT | NULLABLE | Detalles del error si falló el parseo. |
total_lines | INTEGER | NULLABLE | Número total de líneas detectadas en el archivo después del parseo. |
successful_lines | INTEGER | DEFAULT 0, NOT NULL | Contador de líneas del archivo que fueron creadas exitosamente como pedidos en Oracle. |
failed_lines | INTEGER | DEFAULT 0, NOT NULL | Contador de líneas del archivo que fallaron definitivamente (validación o creación en Oracle). |
overall_status_id | INTEGER | NOT NULL, FK REFERENCES cat_file_overall_statuses(status_id) | ID del estado general del procesamiento del archivo. |
last_updated_at | TIMESTAMPTZ | DEFAULT CURRENT_TIMESTAMP, NOT NULL | Fecha y hora de la última actualización del registro. (Actualizado por trigger). |
created_at | TIMESTAMPTZ | DEFAULT CURRENT_TIMESTAMP, NOT NULL | Fecha 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.
| Columna | Tipo de Dato | Restricciones | Descripción |
|---|---|---|---|
line_id | BIGSERIAL | PRIMARY KEY | Identificador único de la línea del archivo. |
file_id | BIGINT | NOT NULL, FK REFERENCES processed_files(file_id) ON DELETE CASCADE | ID del archivo al que pertenece esta línea. |
line_number_in_file | INTEGER | NOT NULL | Número secuencial de la línea dentro de su archivo original. |
client_order_reference | VARCHAR(100) | NULLABLE | Referencia del pedido del cliente (ej. número de orden de compra del cliente). |
product_sku | VARCHAR(50) | NULLABLE | SKU o código del producto. |
quantity | NUMERIC(10,2) | NULLABLE | Cantidad del producto solicitado. |
parsed_data | JSONB | NULLABLE | Almacena cualquier otro dato relevante parseado de la línea en formato JSON. |
sm_state | VARCHAR(50) | NOT NULL | |
validation_status_id | INTEGER | NOT 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_details | TEXT | NULLABLE | Detalles del error si la validación de la línea falló. |
oracle_creation_status_id | INTEGER | NOT 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_id | VARCHAR(100) | NULLABLE | ID del pedido generado en Oracle Fusion si la creación fue exitosa. |
oracle_api_error_details | TEXT | NULLABLE | Detalles del error devuelto por la API de Oracle si la creación del pedido falló. |
retry_count | INTEGER | DEFAULT 0, NOT NULL | Número de reintentos realizados para crear el pedido en Oracle. |
last_oracle_attempt_at | TIMESTAMPTZ | NULLABLE | Fecha y hora del último intento de creación del pedido en Oracle. |
last_updated_at | TIMESTAMPTZ | DEFAULT CURRENT_TIMESTAMP, NOT NULL | Fecha y hora de la última actualización del registro. (Actualizado por trigger). |
created_at | TIMESTAMPTZ | DEFAULT CURRENT_TIMESTAMP, NOT NULL | Fecha 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.
| Columna | Tipo de Dato | Restricciones | Descripción |
|---|---|---|---|
ARCHIVO_ORIGEN | VARCHAR2(100) | NULLABLE | Nombre del archivo EDI de donde provino el pedido. |
NUMERO_PEDIDO | VARCHAR2(30) | PRIMARY KEY (lógico) | Identificador único del pedido. |
FECHA_ENTREGA | TIMESTAMP(6) | NULLABLE | Fecha comprometida de entrega. |
FECHA_CREACION | TIMESTAMP(6) | NULLABLE | Fecha en que se generó el pedido. |
FECHA_PEDIDO | TIMESTAMP(6) | NULLABLE | Fecha en que el cliente realizó el pedido. |
FECHA_CANCELACION | TIMESTAMP(6) | NULLABLE | Fecha de cancelación, si aplica. |
NUMERO_PROVEEDOR | VARCHAR2(20) | NULLABLE | Código interno del proveedor. |
CODIGO_EAN_PROVEEDOR | VARCHAR2(35) | NULLABLE | Código EAN del proveedor. |
NOMBRE_PROVEEDOR | VARCHAR2(35) | NULLABLE | Nombre del proveedor. |
NUMERO_COMPRADOR | VARCHAR2(20) | NULLABLE | Código interno del comprador. |
CODIGO_EAN_COMPRADOR | VARCHAR2(35) | NULLABLE | Código EAN del comprador. |
NOMBRE_COMPRADOR | VARCHAR2(35) | NULLABLE | Nombre del comprador. |
NUMERO_SUCURSAL | VARCHAR2(20) | NULLABLE | Número o código de la sucursal receptora. |
CODIGO_EAN_SUCURSAL | VARCHAR2(35) | NULLABLE | Código EAN de la sucursal receptora. |
NOMBRE_SUCURSAL | VARCHAR2(35) | NULLABLE | Nombre de la sucursal receptora. |
FECHA_RECEPCION | TIMESTAMP(6) | NULLABLE | Fecha en que se espera la recepción. |
MONEDA | VARCHAR2(4) | NULLABLE | Tipo de moneda del pedido (ej. MXN, USD). |
PLAZO_PAGO | VARCHAR2(5) | NULLABLE | Días de crédito pactados. |
CODIGO_EAN_LUGAR_ENTREGA | VARCHAR2(35) | NULLABLE | Código EAN del punto de entrega. |
NOMBRE_LUGAR_ENTREGA | VARCHAR2(60) | NULLABLE | Nombre del lugar de entrega. |
DEPARTAMENTO | VARCHAR2(12) | NULLABLE | Departamento que origina el pedido. |
REFERENCIA | VARCHAR2(12) | NULLABLE | Campo de referencia libre o interna. |
TERMINOS_ENTREGA_TRANSPORTE | VARCHAR2(20) | NULLABLE | Términos de entrega (Incoterms u otros). |
IMPORTE_TOTAL | VARCHAR2(20) | NULLABLE | Importe total del pedido. |
TOTAL_PARTIDAS | VARCHAR2(20) | NULLABLE | Número total de líneas o ítems del pedido. |
FECHA_TRANSACCION | TIMESTAMP(6) | NULLABLE | Fecha en la que fue procesada la orden. |
TIPO_ORDEN | VARCHAR2(50) | NULLABLE | Tipo de orden (ej. regular, express, etc.). |
CLIENTE | VARCHAR2(50) | NULLABLE | Identificador del cliente EDI. |
ESTATUS | VARCHAR2(20) | NULLABLE | Estado actual de la orden. |
TRANSFERIDO | VARCHAR2(1) | NULLABLE | Indica si fue transferido a Oracle (Y/N). |
CONTROL_EDI | VARCHAR2(45) | NULLABLE | Identificador de control EDI único. |
FECHA_GENERACION | TIMESTAMP(6) | NULLABLE | Fecha de generación del documento EDI. |
FECHA_CONTROL | TIMESTAMP(6) | NULLABLE | Fecha de validación/control del documento. |
TRUCK_NUMBER | VARCHAR2(500) | NULLABLE | Número de camión o referencia de transporte. |
TIPO_EDI | VARCHAR2(30) | NULLABLE | Tipo 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.
| Columna | Tipo de Dato | Restricciones | Descripción |
|---|---|---|---|
NUMERO_PEDIDO | VARCHAR2(30) | NOT NULL, FK lógico | Referencia al número de pedido (orders_encabezado_full.NUMERO_PEDIDO). |
DESCRIPCION1 | VARCHAR2(100) | NULLABLE | Descripción principal del producto. |
DESCRIPCION2 | VARCHAR2(100) | NULLABLE | Descripción secundaria o adicional. |
CANTIDAD_PEDIDA | VARCHAR2(10) | NULLABLE | Cantidad pedida del artículo. |
PRECIO_UNITARIO | VARCHAR2(15) | NULLABLE | Precio unitario acordado. |
MONTO_TOTAL_PARTIDA | VARCHAR2(15) | NULLABLE | Monto total de la línea (cantidad × precio). |
CODIGO_EAN_ARTICULO | VARCHAR2(14) | NULLABLE | Código EAN del producto. |
CODIGO_ARTICULO_PROVEEDOR | VARCHAR2(20) | NULLABLE | Código interno del proveedor para el producto. |
CODIGO_ARTICULO_COMPRADOR | VARCHAR2(20) | NULLABLE | Código interno del comprador para el producto. |
PIEZAS_EMPAQUE | VARCHAR2(5) | NULLABLE | Número de piezas por empaque o caja. |
CONTROL_EDI | VARCHAR2(20) | NULLABLE | Identificador EDI para control de trazabilidad. |
FECHA_TRANSACCION | TIMESTAMP(6) | NULLABLE | Fecha en que se procesó esta línea. |
HORA_TRANSACCION | TIMESTAMP(6) | NULLABLE | Hora de la transacción, si está separada. |
CLIENTE | VARCHAR2(20) | NULLABLE | Código del cliente para esta línea. |
TRANSFERIDO | VARCHAR2(1) | NULLABLE | Indicador si ya fue transferido a Oracle. |
ID_DETALLE | NUMBER | PRIMARY KEY (lógico) | Identificador único de la línea. |
UNIDAD_MEDIDA_DIS | VARCHAR2(6) | NULLABLE | Unidad de medida para distribución. |
CODIGO_ARTICULO | VARCHAR2(20) | NULLABLE | Código del artículo en el sistema. |
CANTIDAD_PENDIENTE | VARCHAR2(10) | NULLABLE | Cantidad restante por entregar. |
PAQUETE | VARCHAR2(30) | NULLABLE | Descripción del paquete o agrupador. |
Tabla: notification_logs
Registra todas las notificaciones enviadas por el sistema.
| Columna | Tipo de Dato | Restricciones | Descripción |
|---|---|---|---|
notification_id | BIGSERIAL | PRIMARY KEY | Identificador único del log de notificación. |
file_id | BIGINT | NULLABLE, FK REFERENCES processed_files(file_id) ON DELETE SET NULL | ID del archivo relacionado con la notificación (opcional). |
line_id | BIGINT | NULLABLE, FK REFERENCES file_lines(line_id) ON DELETE SET NULL | ID de la línea de archivo relacionada con la notificación (opcional). |
notification_type_id | INTEGER | NOT NULL, FK REFERENCES cat_notification_types(type_id) | ID del tipo de notificación enviada. |
recipient | VARCHAR(255) | NOT NULL | Destinatario de la notificación (ej. email, cola de mensajes, webhook URL). |
message | TEXT | NOT NULL | Contenido del mensaje de la notificación. |
sent_at | TIMESTAMPTZ | DEFAULT CURRENT_TIMESTAMP, NOT NULL | Fecha y hora en que la notificación fue (o intentó ser) enviada. |
notification_log_status_id | INTEGER | NOT NULL, FK REFERENCES cat_notification_log_statuses(status_id) | ID del estado del envío de la notificación. |
error_message | TEXT | NULLABLE | Mensaje 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.
| Columna | Tipo de Dato | Restricciones | Descripción |
|---|---|---|---|
INTERFACE_ID | VARCHAR | NOT NULL | Identificador único de la interfaz. |
TRANSACCION | VARCHAR | NULLABLE | Código de transacción asociado. |
ORDEN_COMPRA | VARCHAR | NULLABLE | Número de orden de compra. |
RFC | VARCHAR | NULLABLE | RFC del proveedor o solicitante. |
INTERFACE_SOURCE_CODE | VARCHAR | NULLABLE | Código de origen de la interfaz. |
SOURCE_TYPE_CODE | VARCHAR | NULLABLE | Tipo de fuente de la información. |
REQUISITION_TYPE | VARCHAR | NULLABLE | Tipo de requisición. |
DESTINATION_TYPE_CODE | VARCHAR | NULLABLE | Tipo de destino de la requisición. |
QUANTITY | NUMERIC | NULLABLE | Cantidad solicitada. |
UNIT_PRICE | NUMERIC | NULLABLE | Precio unitario del ítem. |
AUTHORIZATION_STATUS | VARCHAR | NULLABLE | Estado de autorización de la requisición. |
BATCH_ID | VARCHAR | NULLABLE | Identificador del lote o batch. |
NOTE_TO_APPROVER | VARCHAR | NULLABLE | Nota dirigida al aprobador. |
PREPARER_ID | VARCHAR | NULLABLE | Identificador del usuario que prepara la requisición. |
HEADER_DESCRIPTION | VARCHAR | NULLABLE | Descripción del encabezado de la requisición. |
HEADER_ATTRIBUTE_CATEGORY | VARCHAR | NULLABLE | Categoría de atributos del encabezado. |
HEADER_ATTRIBUTE8 | VARCHAR | NULLABLE | Atributo adicional 8 del encabezado. |
HEADER_ATTRIBUTE9 | VARCHAR | NULLABLE | Atributo adicional 9 del encabezado. |
NOTE_TO_BUYER | VARCHAR | NULLABLE | Nota dirigida al comprador. |
ITEM_SEGMENT1 | VARCHAR | NULLABLE | Segmento 1 del ítem. |
CHARGE_ACCOUNT_ID | VARCHAR | NULLABLE | Cuenta contable asociada. |
UOM_CODE | VARCHAR | NULLABLE | Unidad de medida del ítem. |
REFERENCE_NUM | VARCHAR | NULLABLE | Número de referencia adicional. |
DESTINATION_ORGANIZATION_ID | VARCHAR | NULLABLE | ID de la organización destino. |
DELIVER_TO_LOCATION_ID | VARCHAR | NULLABLE | ID del lugar de entrega. |
DELIVER_TO_REQUESTOR_ID | VARCHAR | NULLABLE | ID del solicitante de la entrega. |
DELIVERY_NUMBER | VARCHAR | NULLABLE | Número de entrega asociado. |
LOTE | VARCHAR | NULLABLE | Lote del producto. |
SUGGESTED_VENDOR_ID | VARCHAR | NULLABLE | ID del proveedor sugerido. |
SUGGESTED_VENDOR_SITE_ID | VARCHAR | NULLABLE | ID del sitio del proveedor sugerido. |
NEED_BY_DATE | TIMESTAMP | NULLABLE | Fecha en que se necesita la requisición. |
DOCUMENT_DATE | TIMESTAMP | NULLABLE | Fecha del documento. |
CURRENCY_CODE | VARCHAR | NULLABLE | Código de moneda. |
ORG_ID | VARCHAR | NULLABLE | Identificador de la organización. |
STATUS | VARCHAR | NULLABLE | Estado de la requisición. |
ERROR_DESCRIPTION | VARCHAR | NULLABLE | Descripción de error si aplica. |
TIPO_DOCUMENTO | VARCHAR | NULLABLE | Tipo de documento. |
USER_PREPARER | VARCHAR | NULLABLE | Usuario que preparó la requisición. |
GLN | VARCHAR | NULLABLE | Global Location Number. |
ES_ULTIMA_ENTREGA | VARCHAR | NULLABLE | Indica si es la última entrega. |
SSCC | VARCHAR | NULLABLE | Código de contenedor de envío (Serial Shipping Container Code). |
CREATED_BY | VARCHAR | NULLABLE | Usuario que creó el registro. |
CREATION_DATE | TIMESTAMP | NULLABLE | Fecha de creación del registro. |
LAST_UPDATED_BY | VARCHAR | NULLABLE | Usuario que realizó la última actualización. |
LAST_UPDATE_DATE | TIMESTAMP | NULLABLE | Fecha de la última actualización. |
LIN_SELECCIONADA | VARCHAR | NULLABLE | Línea seleccionada. |
QUANTITY2 | NUMERIC | NULLABLE | Cantidad adicional. |
Tabla: ALP_TMP_REQ_HEADER_INTERFACE
Registra la información de encabezados de requisiciones en el sistema.
| Columna | Tipo de Dato | Restricciones | Descripción |
|---|---|---|---|
INTERFACE_ID | VARCHAR | NOT NULL | Identificador único de la interfaz. |
TRANSACCION | VARCHAR | NULLABLE | Código de transacción asociado. |
ORDEN_COMPRA | VARCHAR | NULLABLE | Número de orden de compra. |
RFC | VARCHAR | NULLABLE | RFC del proveedor o solicitante. |
HEADER_ATTRIBUTE8 | VARCHAR | NULLABLE | Atributo adicional 8 del encabezado. |
DELIVER_TO_LOCATION_ID | VARCHAR | NULLABLE | ID del lugar de entrega. |
SUGGESTED_VENDOR_ID | VARCHAR | NULLABLE | ID del proveedor sugerido. |
DOCUMENT_DATE | TIMESTAMP | NULLABLE | Fecha del documento. |
ORG_ID | VARCHAR | NULLABLE | Identificador de la organización. |
USER_PREPARER | VARCHAR | NULLABLE | Usuario que preparó la requisición. |
GLN | VARCHAR | NULLABLE | Global Location Number. |
ESTATUS | VARCHAR | NULLABLE | Estado del encabezado de la requisición. |
ERROR_DESCRIPTION | VARCHAR | NULLABLE | Descripción de error si aplica. |
TIPO_DOCUMENTO | VARCHAR | NULLABLE | Tipo de documento. |
CREATED_BY | VARCHAR | NULLABLE | Usuario que creó el registro. |
CREATION_DATE | TIMESTAMP | NULLABLE | Fecha de creación del registro. |
LAST_UPDATED_BY | VARCHAR | NULLABLE | Usuario que realizó la última actualización. |
LAST_UPDATE_DATE | TIMESTAMP | NULLABLE | Fecha 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_LINE | Línea recién parseada por DELTA, lista para validación. |
VALIDATING | En proceso de validación de datos contra Oracle Fusion APIs. |
VALIDATED | Línea validada exitosamente, lista para creación en Oracle. |
VALIDATION_FAILED | Falló la validación de datos. Estado terminal para esta línea. |
CREATING_IN_ORACLE | En proceso de creación del pedido en Oracle Fusion. Se incrementa retry_count (o attempt_count) aquí. |
ORACLE_CREATION_SUCCESSFUL | Pedido creado exitosamente en Oracle Fusion. Estado terminal. |
PENDING_RETRY | Falló la creación en Oracle, pero es reintentable y quedan intentos. |
ORACLE_CREATION_FAILED_TERMINAL | Falló la creación en Oracle tras todos los reintentos, o por error no reintentable. Estado terminal. |
6.4 Eventos (Events - EV)
| Evento | Disparador | Descripción |
|---|---|---|
EV_VALIDATE | Spring Batch (Proceso de Validación) | Inicia la validación de la línea. |
EV_VALIDATION_SUCCESS | Lógica interna de la SM (resultado de la acción de validación) | La validación fue exitosa. |
EV_VALIDATION_FAILURE | Lógica interna de la SM (resultado de la acción de validación) | La validación falló. |
EV_CREATE_IN_ORACLE | Spring Batch (Proceso de Creación de Pedidos) | Inicia la creación del pedido en Oracle. |
EV_ORACLE_CREATION_SUCCESS | Ló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.
Actualizarvalidation_error_detailssi falla. -
S_CREATING_IN_ORACLE(on entry):
Incrementarretry_count.
Llamar a la API de creación de pedidos de Oracle Fusion.
Actualizaroracle_api_error_detailssi falla yoracle_order_idsi tiene éxito.
Actualizarlast_oracle_attempt_at. -
S_ORACLE_CREATION_FAILED_TERMINAL(on entry):
InvocarNotification_Service.
Guardias (Transition Guards)
-
Transición
CREATING_IN_ORACLE→PENDING_RETRY:
isRetryableErrorFromOracle() && context.getExtendedState().getVariables().get("retry_count") < MAX_RETRIES -
Transición
CREATING_IN_ORACLE→ORACLE_CREATION_FAILED_TERMINAL:
!isRetryableErrorFromOracle() || context.getExtendedState().getVariables().get("retry_count") >= MAX_RETRIES
6.6 Persistencia de la Máquina de Estados
-
Se utilizará un
StateMachinePersisterde Spring State Machine
(por ejemplo,RepositoryStateMachinePersistcon 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 tablafile_lines. -
Cada
line_idservirá como identificador único para su instancia de máquina de estados.
6.7 Componente State Machine Manager
-
Un bean de Spring llamado
OrderLineStateMachineManagerencapsulará 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 enNEW_LINE, para cada una obtendrá su SM y enviará el eventoEV_VALIDATE. -
Job de Creación de Pedidos:
Leerá líneas enVALIDATED, para cada una obtendrá su SM y enviará el eventoEV_CREATE_IN_ORACLE. -
Job de Reintentos (Opcional):
Podría haber un job dedicado que lea líneas enPENDING_RETRYy envíe el eventoEV_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