Skip to content

Nomenclatura para Templates EDI

Tabla de Contenidos

  1. Introducción
  2. Tipos de Datos de Elementos
  3. Representación de Fuentes de Datos
  4. Lógica Condicional
  5. Elementos Condicionales
  6. Segmentos Repetibles
  7. Transformaciones
  8. Cálculos Dinámicos
  9. Templates Genéricos con Variaciones
  10. Estructura de Templates por Combinación Carrier + Documento
  11. Ejemplos Completos
  12. Casos Especiales
  13. Validación y Reglas
  14. Referencias Cruzadas

Introducción

Propósito

Este documento define la nomenclatura formal y estructura para representar documentos EDI en formato JSON. La especificación está diseñada para permitir la generación precisa de templates EDI que el sistema externo puede interpretar para crear documentos EDI según el estándar X12.

Principio Fundamental: Templates Autocontenidos

Cada template es autocontenido y específico para una combinación carrier + documento.

Esto significa que:

  • Cada template contiene TODAS las configuraciones específicas para esa combinación particular
  • No se utilizan condiciones basadas en carrier_id dentro de los templates, ya que cada template ya es específico de un carrier
  • Las condiciones internas se basan en datos, estatus, campos, parámetros del sistema, etc., pero nunca en el carrier
  • Cada combinación conocida de carrier + documento tiene su propio template completo

Ejemplo:

  • Template: EDI 214 para PENSKE (carrier_id: 5) → Contiene todas las configuraciones específicas de PENSKE
  • Template: EDI 214 para XPOLOGISTICS (carrier_id: 6) → Contiene todas las configuraciones específicas de XPOLOGISTICS

Relación con la Documentación Completa

Esta nomenclatura complementa la documentación técnica completa en DOCUMENTACION-EDI-COMPLETA.md, la cual describe en detalle:

  • Todos los documentos EDI soportados (214, 997, 990, 210)
  • Segmentos y elementos de cada documento
  • Variaciones por carrier documentadas
  • Fuentes de datos y mapeos completos

Esta especificación de nomenclatura define cómo representar esa información técnica en formato JSON para que pueda ser interpretada por el sistema.

Convenciones Generales

  • Formato: JSON válido
  • Encoding: UTF-8
  • Estructura: Jerárquica, con segmentos conteniendo elementos
  • Referencias: Las fuentes de datos usan notación punto (ej: dsEDIDetalle.Reference)
  • Condiciones: Expresadas en formato que puede evaluarse como expresión booleana
  • Valores fijos: Strings entre comillas
  • Valores vacíos: Representados como strings vacíos "" o null

Tipos de Datos de Elementos

Cada elemento en un segmento EDI tiene un data_type que determina cómo se obtiene su valor. Los tipos disponibles son:

fixed

Valor constante que no cambia.

Ejemplo:

{
"element_id": "ISA01",
"data_type": "fixed",
"value": "00",
"length": 2,
"required": true
}

variable

Valor obtenido de una fuente de datos (ver sección de Fuentes de Datos).

Ejemplo:

{
"element_id": "ISA06",
"data_type": "variable",
"source": "dsEDIDetalle.SCAC",
"length": 15,
"padding": "right",
"pad_char": " ",
"required": true,
"transform": "complete"
}

conditional

Valor que depende de una condición (ver sección de Elementos Condicionales).

Ejemplo:

{
"element_id": "L1102",
"data_type": "conditional",
"condition": {
"if": "system_param.SegmentoL11Penske == true",
"then": "dsEDIDetalle.RunNumber",
"else": "RN"
},
"required": true
}

calculated

Valor calculado dinámicamente mediante una expresión (ver sección de Cálculos Dinámicos).

Ejemplo:

{
"element_id": "SE01",
"data_type": "calculated",
"calculation": "segment_count + 1",
"required": true
}

system_date

Fecha del sistema formateada según un patrón específico.

Ejemplo:

{
"element_id": "ISA09",
"data_type": "system_date",
"format": "YYMMDD",
"required": true
}

Formatos comunes:

  • YYMMDD: Año corto, mes, día (ej: “250115”)
  • YYYYMMDD: Año completo, mes, día (ej: “20250115”)

system_time

Hora del sistema formateada según un patrón específico.

Ejemplo:

{
"element_id": "ISA10",
"data_type": "system_time",
"format": "HHMM",
"required": true
}

Formatos comunes:

  • HHMM: Hora y minutos en formato 24h (ej: “1430”)

Representación de Fuentes de Datos

Las fuentes de datos se referencian usando notación de punto para indicar la jerarquía de objetos y propiedades.

Convenciones de Nomenclatura

PrefijoTipoEjemploDescripción
dsData SourcedsEDIDetalle.ReferenceResultado de queries principales
m_Propiedad de clasem_sIdentSolicitudPropiedades de la clase ClsProSolicitudesEDI
clObjeto/Clase relacionadaclViaje.m_sIdentificadorObjetos obtenidos de otras clases
system_paramParámetro del sistemasystem_param.SegmentoL11PenskeParámetros configurables del sistema

Fuentes de Datos Principales

Data Sources (ds)

Resultados de queries principales que retornan datasets:

Data Source Principal:

  • dsEDIDetalle: Resultado de GetListadoDetalleEdiByIdSolicitudEDI()

Data Sources Adicionales:

  • dsSolicitudesEDIDetalleL11: Resultado de GetListadoPOByIdSolicitudEDI() (para L11-PO repetibles)
  • dsUnload: Resultado de GetUnload() (solo PROTRANS)

Propiedades de Clase (m_)

Propiedades de la instancia de ClsProSolicitudesEDI:

  • m_nIdSolicitudEDI: ID numérico de la solicitud EDI
  • m_sIdentSolicitud: Identificador string de la solicitud
  • m_sCarrierPro: Carrier Pro string
  • m_sSCACAplicacion: SCAC de aplicación
  • m_nCarrierAplicacion: ID del carrier (numérico)
  • m_sTipo: Tipo (usado en AUTOLIV/ADIENT para ISA15)

Objetos Relacionados (cl)

Objetos obtenidos de otras clases mediante constructores o métodos:

  • clViaje: ClsProViajes(nIdViaje)

    • clViaje.m_sIdentificador: Identificador del viaje
    • clViaje.m_nIdCliente: ID del cliente
    • clViaje.m_nIdUnidadCarga1: ID de la unidad
  • clCatEstatusViajeDetalle: ClsCatEstatusViaje(nIdEstatusViaje)

    • clCatEstatusViajeDetalle.m_sAbreviacion: Abreviación del estatus (ej: “X6”)
    • clCatEstatusViaje.m_nCargaDescarga: Tipo de carga/descarga (1=carga, 2=descarga)
  • clProViajesEstatus: ClsProViajesEstatus(nIdProViajesEstatus)

    • clProViajesEstatus.m_dtFechaHora..Date: Fecha del estatus
    • clProViajesEstatus.m_dtFechaHora..Time: Hora del estatus
    • clProViajesEstatus.m_sComentarioEstatus: Comentario del estatus
  • clCliente: ClsCatClientes(clViaje.m_nIdCliente)

    • clCliente.m_sNombreCorto: Nombre corto del cliente (usado en JUSTRANSFORM)

Variables Calculadas

Valores derivados que se calculan durante la generación:

  • sGSSCAC: SCAC para GS, puede variar (ej: “AETMENLOPDX ” para XPOLOGISTICS)
  • sMotivoRetraso: Motivo de retraso, default “NS”
  • sCodigoUnidadPintarMs2: Código de unidad obtenido de ClsCatUnidades::GetCodigoByIdUnidad()
  • nCargaDescargaTMP: Tipo de carga/descarga temporal
  • sUltimaUbicacion: String hardcodeado para GPS: “MS1***00WN”

Fuentes de Datos EDI 210

El EDI 210 utiliza un contexto de facturación (ProFacturas) distinto al de solicitudes EDI:

  • gnIdFactura: Parámetro global, ID de la factura (en lugar de m_nIdSolicitudEDI)
  • gsEmpresa: RFC de la empresa (parámetro de página)
  • sScacCliente: SCAC del cliente obtenido de CatClientesFacturacionEDI

Objetos relacionados (EDI 210):

  • clFactura: ClsProFacturas(gnIdFactura)

    • clFactura.m_nIdCliente, clFactura.m_nIdFolio, clFactura.m_nCondicionesPago
    • clFactura.m_nIdMoneda, clFactura.m_dtFechaHora, clFactura.m_cySubTotal, clFactura.m_cyTotal
  • clFolio: ClsCatFolios(clFactura.m_nIdFolio)

    • clFolio.m_nFolioInicial, clFolio.m_sSerie
  • clCliente: ClsCatClientes(clFactura.m_nIdCliente)

    • clCliente.m_sNombreFiscal, clCliente.m_sCalle, clCliente.m_sNoExterior
    • clCliente.m_sLocalidad, clCliente.m_sIdEstado, clCliente.m_sCodigoPostal
  • clViaje: ClsProViajes(nIdViaje) — nIdViaje del primer viaje de la factura (GetListadoViajesByIdFactura)

    • clViaje.m_nIdRemitente, clViaje.m_nIdDestinatario, clViaje.m_dtFechaCarga, clViaje.m_dtFechaEntrega
    • clViaje.m_xPeso, clViaje.m_nIdUnidadPeso, clViaje.m_sNoViajeCliente
  • clRemitente, clDestinatario: ClsCatRemitentesDestinatarios(clViaje.m_nIdRemitente/Destinatario)

Data Source para conceptos: Query ProFacturasConceptosFacturacion + CatConceptosFacturacion por IdFactura

Variables calculadas EDI 210:

  • sMetodoPago: “CC” si condiciones pago=1, “PP” si condiciones pago=2
  • sAbreviacionMoneda: “MXN” o “USD” según clFactura.m_nIdMoneda

Parámetros del Sistema (system_param)

  • system_param.SegmentoL11Penske: Boolean, default false (afecta L11 en PENSKE)
  • system_param.GenerarArchivoFormatoISA: Boolean, default false
  • system_param.URLServiciosWEBClienteEDI: String, URL del servicio SOAP

Lógica Condicional

La lógica condicional permite que segmentos o elementos aparezcan solo cuando se cumplen ciertas condiciones. Las condiciones se basan en datos, estatus, campos, parámetros del sistema, etc., pero nunca en el carrier (ya que cada template es específico de un carrier).

Operadores Disponibles en Condiciones

  • ==: Igualdad
  • !=: Desigualdad
  • >: Mayor que
  • <: Menor que
  • >=: Mayor o igual que
  • <=: Menor o igual que
  • &&: AND lógico
  • ||: OR lógico
  • !: NOT lógico

Ejemplos de condiciones válidas:

  • dsEDIDetalle.StopNum != ''
  • clCatEstatusViajeDetalle.m_sAbreviacion == "X6"
  • system_param.SegmentoL11Penske == true
  • nCargaDescargaTMP == 1
  • dsEDIDetalle.TrackingNum != '' && clCatEstatusViajeDetalle.m_sAbreviacion != "X6"

4.1 Condición Simple (IF)

Un segmento que solo se incluye si se cumple una condición.

Estructura:

{
"segment_id": "L11",
"required": false,
"conditional": {
"type": "if",
"condition": "dsEDIDetalle.StopNum != ''",
"then": {
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "dsEDIDetalle.StopNum",
"required": true
},
{
"element_id": "L1102",
"data_type": "fixed",
"value": "QN",
"required": true
}
]
}
}
}

Ejemplo real: L11-QN que solo aparece si existe StopNum.

4.2 Condición IF/ELSE

Un segmento con dos variantes según una condición.

Estructura:

{
"segment_id": "L11",
"required": true,
"conditional": {
"type": "if_else",
"conditions": [
{
"if": "dsEDIDetalle.RunNumber != ''",
"then": {
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "dsEDIDetalle.RunNumber",
"required": true
},
{
"element_id": "L1102",
"data_type": "conditional",
"condition": {
"if": "system_param.SegmentoL11Penske == true",
"then": "dsEDIDetalle.RunNumber",
"else": "RN"
},
"required": true
}
]
},
"else": {
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "dsEDIDetalle.ManifestNumber",
"required": true
},
{
"element_id": "L1102",
"data_type": "fixed",
"value": "MA",
"required": true
}
]
}
}
]
}
}

Ejemplo real: Primer L11 en PENSKE que puede ser RN o MA según si existe RunNumber.

4.3 Condición SWITCH

Un segmento con múltiples variantes según el valor de una variable.

Estructura:

{
"segment_id": "MS1",
"required": false,
"conditional": {
"type": "switch",
"switch_on": "clCatEstatusViajeDetalle.m_sAbreviacion",
"cases": [
{
"case": "X6",
"action": {
"type": "gps_location",
"format": "DMS",
"value": "MS1****0*0*W*N"
}
},
{
"case": "default",
"action": {
"type": "conditional",
"condition": {
"if": "nCargaDescargaTMP == 1",
"then": {
"elements": [
{
"element_id": "MS101",
"data_type": "variable",
"source": "dsEDIDetalle.ShipFromCity",
"required": true
},
{
"element_id": "MS102",
"data_type": "variable",
"source": "dsEDIDetalle.ShipFromState",
"required": true
},
{
"element_id": "MS103",
"data_type": "variable",
"source": "dsEDIDetalle.ShipFromCountry",
"required": true
}
]
},
"else_if": "nCargaDescargaTMP == 2",
"then": {
"elements": [
{
"element_id": "MS101",
"data_type": "variable",
"source": "dsEDIDetalle.ShipToCity",
"required": true
},
{
"element_id": "MS102",
"data_type": "variable",
"source": "dsEDIDetalle.ShipToState",
"required": true
},
{
"element_id": "MS103",
"data_type": "variable",
"source": "dsEDIDetalle.ShipToCountry",
"required": true
}
]
},
"else": {
"elements": [
{
"element_id": "MS101",
"data_type": "variable",
"source": "dsEDIDetalle.ShipFromCity",
"required": true
},
{
"element_id": "MS102",
"data_type": "variable",
"source": "dsEDIDetalle.ShipFromState",
"required": true
},
{
"element_id": "MS103",
"data_type": "variable",
"source": "dsEDIDetalle.ShipFromCountry",
"required": true
}
]
}
}
}
}
]
}
}

Ejemplo real: MS1 en PENSKE que puede ser GPS (si estatus X6) o ubicación según carga/descarga.

4.4 Condiciones Anidadas

Las condiciones pueden anidarse para manejar lógica compleja. En el ejemplo anterior de SWITCH, el caso “default” contiene una condición anidada que verifica el tipo de carga/descarga.

Principio: Siempre debe haber un caso “default” o un “else” final para asegurar que siempre haya un resultado.


Elementos Condicionales

Para elementos cuyo valor depende de una condición (no todo el segmento, solo el valor del elemento).

Estructura:

{
"element_id": "L1102",
"description": "Reference Identification Qualifier",
"data_type": "conditional",
"condition": {
"if": "system_param.SegmentoL11Penske == true",
"then": "dsEDIDetalle.RunNumber",
"else": "RN"
},
"required": true
}

Ejemplo real: L1102 en PENSKE que puede ser el RunNumber mismo o “RN” según un parámetro del sistema.

Nota: Los elementos condicionales también pueden tener condiciones más complejas con else_if si es necesario.


Segmentos Repetibles

Algunos segmentos pueden aparecer múltiples veces en un documento EDI. Un ejemplo es L11-PO en XPOLOGISTICS, donde hay un L11-PO por cada Purchase Order.

Estructura:

{
"segment_id": "L11",
"segment_name": "Business Instructions and Reference Number - PO",
"required": false,
"position": 6,
"repeat": true,
"repeat_source": "dsSolicitudesEDIDetalleL11",
"repeat_query": "GetListadoPOByIdSolicitudEDI(m_nIdSolicitudEDI)",
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "dsSolicitudesEDIDetalleL11.PO",
"required": true
},
{
"element_id": "L1102",
"data_type": "fixed",
"value": "PO",
"required": true
}
]
}

Propiedades:

  • repeat: true indica que el segmento puede repetirse
  • repeat_source: Nombre del data source que contiene los múltiples valores
  • repeat_query: Query o método que obtiene el data source repetible

Comportamiento: El sistema ejecutará la query y generará un segmento L11 por cada registro en el resultado.


Transformaciones

Las transformaciones se aplican a valores variables antes de incluirlos en el documento EDI final.

Transformaciones Disponibles

complete

Rellena un string a una longitud específica con un carácter de padding.

Parámetros:

  • value: Valor original
  • length: Longitud deseada
  • pad_char: Carácter de padding (generalmente ” ” para espacios)
  • padding: Dirección del padding (“left” o “right”)

Ejemplo:

{
"element_id": "ISA06",
"data_type": "variable",
"source": "dsEDIDetalle.SCAC",
"length": 15,
"padding": "right",
"pad_char": " ",
"transform": "complete"
}

Resultado: Si SCAC = "PENSKE", se convierte en "PENSKE " (15 caracteres).

num_to_string

Convierte un número a string con formato específico.

Parámetros:

  • value: Número a convertir
  • format: Formato (ej: “09d” para 9 dígitos con ceros a la izquierda)

Ejemplo:

{
"element_id": "ISA13",
"data_type": "variable",
"source": "m_nIdSolicitudEDI",
"format": "09d",
"transform": "num_to_string"
}

Resultado: Si m_nIdSolicitudEDI = 123, se convierte en "000000123".

date_to_string

Convierte una fecha a string con formato específico.

Parámetros:

  • value: Fecha (objeto Date)
  • format: Formato (ej: “YYYYMMDD”, “YYMMDD”)

Ejemplo:

{
"element_id": "AT705",
"data_type": "variable",
"source": "dtFechaHoraEstatus..Date",
"format": "YYYYMMDD",
"transform": "date_to_string"
}

time_to_string

Convierte una hora a string con formato específico.

Parámetros:

  • value: Hora (objeto Time)
  • format: Formato (ej: “HHMM”)

Ejemplo:

{
"element_id": "AT706",
"data_type": "variable",
"source": "tHoraEstatus",
"format": "HHMM",
"transform": "time_to_string"
}

gps_to_dms

Convierte coordenadas GPS a formato Grados-Minutos-Segundos (DMS).

Parámetros:

  • latitude: Latitud
  • longitude: Longitud

Nota: Esta transformación genera un formato especial hardcodeado como "MS1****0*0*W*N".


Cálculos Dinámicos

Algunos elementos requieren cálculos dinámicos basados en el estado actual del documento (ej: contador de segmentos).

Estructura:

{
"element_id": "SE01",
"description": "Number of Included Segments",
"data_type": "calculated",
"calculation": "segment_count + 1",
"required": true
}

Variables Disponibles en Cálculos

  • segment_count: Contador automático de segmentos incluidos hasta el momento
  • nContadorST_SE: Contador específico que se incrementa manualmente (usado en algunos casos)
  • nRenglon: Contador alternativo usado en TRANSPLACE y ALCLOGISTICS (se inicializa en 9 y se decrementa cuando segmentos opcionales no se incluyen)

Operadores Disponibles

  • +: Suma
  • -: Resta
  • *: Multiplicación
  • /: División

Ejemplos:

  • segment_count + 1: Suma 1 al contador de segmentos
  • nContadorST_SE + 1: Suma 1 al contador específico
  • nRenglon - 1: Resta 1 al contador alternativo

Nota: El cálculo se ejecuta en tiempo de generación, después de que todos los segmentos condicionales hayan sido evaluados.


Templates Genéricos con Variaciones

Concepto

Los templates genéricos contienen:

  • Partes constantes: Elementos y segmentos que son iguales para todos los carriers
  • Partes variables: Elementos y segmentos que tienen variaciones conocidas, representadas como opciones disponibles

Cada parte variable tiene un array options que lista todas las opciones conocidas sin asociarlas a carriers específicos.

Principio de Agnosticidad a Carriers

Las variaciones en templates genéricos son agnósticas a carriers. No se especifica qué carriers usan cada opción, sino simplemente qué opciones están disponibles. Esto permite:

  • Agregar nuevos carriers sin modificar el template genérico
  • Cambiar partes de fijas a variables sin romper compatibilidad
  • Que el editor permita al usuario seleccionar qué opción usar para cada parte variable al crear un template específico de carrier + documento

Estructura para Elementos Variables

Un elemento que puede tener diferentes valores según el carrier se marca como variable: true y contiene un array options:

{
"element_id": "ISA16",
"description": "Component Element Separator",
"variable": true,
"options": [
{
"id": "pipe",
"description": "Pipe separator (|)",
"value": "|",
"data_type": "fixed"
},
{
"id": "colon",
"description": "Colon separator (:)",
"value": ":",
"data_type": "fixed"
},
{
"id": "greater_than",
"description": "Greater than separator (>)",
"value": ">",
"data_type": "fixed"
}
]
}

Estructura para Segmentos Variables

Un segmento que puede estar incluido u omitido, o tener diferentes configuraciones:

{
"segment_id": "MS1",
"segment_name": "Equipment, Shipment, or Real Property Location",
"variable": true,
"options": [
{
"id": "excluded",
"description": "Segment not included",
"included": false
},
{
"id": "with_location",
"description": "Segment with location (City/State/Country)",
"included": true,
"required": false,
"position": 8,
"conditional": { ... }
}
]
}

Propiedades de Options

Cada opción en el array options puede tener:

  • id: Identificador único de la opción (requerido, usado para referencia en templates específicos)
  • description: Descripción de qué representa esta opción (requerido, para UI del editor)
  • value: Valor para elementos fixed (opcional)
  • data_type: Tipo de dato (opcional, hereda del elemento padre si no se especifica)
  • included: Boolean para segmentos (si está incluido o no, opcional)
  • elements: Array de elementos para esta opción (opcional)
  • conditional: Lógica condicional para esta opción (opcional)
  • repeat: Boolean indicando si el segmento es repetible (opcional)
  • repeat_source: Nombre del data source para segmentos repetibles (opcional)
  • repeat_query: Query o método que obtiene el data source repetible (opcional)
  • Todas las demás propiedades del elemento/segmento pueden especificarse por opción

Mapeo a Template Específico

Cuando se crea un template específico para carrier + documento, se referencia la opción seleccionada:

Para elementos simples:

{
"element_id": "ISA16",
"variable": true,
"selected_option": "pipe"
}

Para segmentos que aparecen una vez:

{
"segment_id": "MS1",
"variable": true,
"selected_option": "with_location"
}

Para segmentos que pueden aparecer múltiples veces:

{
"segment_id": "L11",
"variable": true,
"selected_options": [
{
"position": 5,
"option_id": "rn_ma_tn_penske"
},
{
"position": 10,
"option_id": "bm_conditional"
}
]
}

Propósito: Los templates genéricos definen el espacio de posibilidades conocido, sin asociarlas a carriers específicos. El editor usa esto como base y permite al usuario seleccionar qué opción usar para cada parte variable al crear o editar un template específico de carrier + documento.


Estructura de Templates por Combinación Carrier + Documento

Principio de Autocontención

Cada combinación conocida de carrier + documento tiene su propio template autocontenido que incluye todas las configuraciones específicas para esa combinación.

Identificación de Templates

Los templates se identifican por:

  • carrier_id: ID numérico del carrier
  • carrier_name: Nombre del carrier
  • document_type: Tipo de documento EDI (“214”, “997”, “990”)

Estructura del Template

{
"edi_config": {
"carrier_id": 5,
"carrier_name": "PENSKE",
"document_type": "214",
"document_description": "Transportation Carrier Shipment Status Message",
"version": "1.0",
"active": true,
"global_settings": { ... },
"data_sources": { ... },
"segments": [ ... ],
"validation_rules": [ ... ],
"soap_config": { ... },
"transformations": { ... }
}
}

Características de Templates Autocontenidos

  1. Valores específicos ya definidos:

    • Separadores (ISA16 puede ser ”|”, ”:”, ”>”)
    • Terminadores (algunos carriers agregan ”~” después de IEA)
    • Identificadores específicos (ej: GS03 = “AETMENLOPDX ” para XPOLOGISTICS)
  2. Segmentos incluidos u omitidos:

    • SAPLBN no incluye MS1 ni MS2
    • XPOLOGISTICS no incluye LX
    • Algunos carriers incluyen segmentos adicionales (N1/N3/N4, MS3, AT8)
  3. Condiciones internas:

    • Basadas en datos, estatus, campos
    • No basadas en carrier (ya que el template es específico del carrier)
  4. Valores hardcodeados específicos:

    • Direcciones fijas (ej: “LEAR CORPORATION” en XPOLOGISTICS)
    • Códigos específicos (ej: “OOCLIES” en OOCL)

Ejemplo de Variación entre Carriers

EDI 214 - ISA16 (Component Element Separator):

  • PENSKE: "|"
  • AUTOLIV: ":"
  • OOCL: ">"
  • PROTRANS: ">"

En el template de PENSKE:

{
"element_id": "ISA16",
"data_type": "fixed",
"value": "|"
}

En el template de AUTOLIV:

{
"element_id": "ISA16",
"data_type": "fixed",
"value": ":"
}

No hay condición que evalúe el carrier, simplemente cada template tiene el valor correcto ya definido.


Ejemplos Completos

A continuación se presentan ejemplos completos de templates autocontenidos para diferentes combinaciones carrier + documento. Estos ejemplos ilustran cómo representar casos particulares específicos de cada carrier.

Nota: Los ejemplos muestran secciones clave de cada template. Para ver un ejemplo completo y funcional, referirse a docs/edi.json que contiene un template completo de ejemplo para PENSKE.

Ejemplo 10.1: EDI 214 - PENSKE

carrier_id: 5
carrier_name: “PENSKE”

Características específicas de PENSKE:

  • ISA05/ISA07 = “02”
  • ISA16 = ”|”
  • L11 condicional complejo (RN/MA/TN según RunNumber y parámetro SegmentoL11Penske)
  • LX01 = “1” (fijo)
  • AT7 con Time Code “LT”
  • MS1 condicional (GPS si estatus X6, o ubicación según carga/descarga)
  • Múltiples L11 opcionales (BM, QN, 2I)
  • IEA con terminador ”~” condicional según parámetro

Template (secciones clave):

{
"edi_config": {
"carrier_id": 5,
"carrier_name": "PENSKE",
"document_type": "214",
"document_description": "Transportation Carrier Shipment Status Message - PENSKE",
"version": "1.0",
"active": true,
"global_settings": {
"element_separator": "*",
"segment_terminator": "~",
"component_separator": "|",
"line_ending": "CR",
"encoding": "UTF8",
"timezone": "LT",
"date_format": "YYYYMMDD",
"time_format": "HHMM",
"add_final_terminator": false
},
"segments": [
{
"segment_id": "ISA",
"segment_name": "Interchange Control Header",
"required": true,
"position": 1,
"repeat": false,
"elements": [
{
"element_id": "ISA05",
"data_type": "fixed",
"value": "02",
"required": true
},
{
"element_id": "ISA07",
"data_type": "fixed",
"value": "02",
"required": true
},
{
"element_id": "ISA16",
"data_type": "fixed",
"value": "|",
"required": true
}
]
},
{
"segment_id": "GS",
"segment_name": "Functional Group Header",
"required": true,
"position": 2,
"repeat": false,
"elements": [
{
"element_id": "GS01",
"data_type": "fixed",
"value": "QM",
"required": true
},
{
"element_id": "GS02",
"data_type": "variable",
"source": "sGSSCAC",
"required": true
},
{
"element_id": "GS03",
"data_type": "variable",
"source": "dsEDIDetalle.InterchangeReceiverID",
"required": true
}
]
},
{
"segment_id": "L11",
"segment_name": "Business Instructions and Reference Number - First",
"required": true,
"position": 5,
"repeat": false,
"conditional": {
"type": "if_else",
"conditions": [
{
"if": "dsEDIDetalle.RunNumber != ''",
"then": {
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "dsEDIDetalle.RunNumber",
"required": true
},
{
"element_id": "L1102",
"data_type": "conditional",
"condition": {
"if": "system_param.SegmentoL11Penske == true",
"then": "dsEDIDetalle.RunNumber",
"else": "RN"
},
"required": true
}
]
},
"else": {
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "dsEDIDetalle.ManifestNumber",
"required": true
},
{
"element_id": "L1102",
"data_type": "fixed",
"value": "MA",
"required": true
}
]
}
}
]
}
},
{
"segment_id": "LX",
"segment_name": "Assigned Number",
"required": true,
"position": 6,
"repeat": false,
"elements": [
{
"element_id": "LX01",
"data_type": "fixed",
"value": "1",
"required": true
}
]
},
{
"segment_id": "AT7",
"segment_name": "Shipment Status Details",
"required": true,
"position": 7,
"repeat": false,
"elements": [
{
"element_id": "AT707",
"data_type": "fixed",
"value": "LT",
"required": true
}
]
},
{
"segment_id": "MS1",
"segment_name": "Equipment, Shipment, or Real Property Location",
"required": false,
"position": 8,
"repeat": false,
"conditional": {
"type": "switch",
"switch_on": "clCatEstatusViajeDetalle.m_sAbreviacion",
"cases": [
{
"case": "X6",
"action": {
"type": "gps_location",
"format": "DMS",
"value": "MS1****0*0*W*N"
}
},
{
"case": "default",
"action": {
"type": "conditional",
"condition": {
"if": "nCargaDescargaTMP == 1",
"then": {
"elements": [
{
"element_id": "MS101",
"data_type": "variable",
"source": "dsEDIDetalle.ShipFromCity",
"required": true
},
{
"element_id": "MS102",
"data_type": "variable",
"source": "dsEDIDetalle.ShipFromState",
"required": true
},
{
"element_id": "MS103",
"data_type": "variable",
"source": "dsEDIDetalle.ShipFromCountry",
"required": true
}
]
},
"else_if": "nCargaDescargaTMP == 2",
"then": {
"elements": [
{
"element_id": "MS101",
"data_type": "variable",
"source": "dsEDIDetalle.ShipToCity",
"required": true
},
{
"element_id": "MS102",
"data_type": "variable",
"source": "dsEDIDetalle.ShipToState",
"required": true
},
{
"element_id": "MS103",
"data_type": "variable",
"source": "dsEDIDetalle.ShipToCountry",
"required": true
}
]
},
"else": {
"elements": [
{
"element_id": "MS101",
"data_type": "variable",
"source": "dsEDIDetalle.ShipFromCity",
"required": true
},
{
"element_id": "MS102",
"data_type": "variable",
"source": "dsEDIDetalle.ShipFromState",
"required": true
},
{
"element_id": "MS103",
"data_type": "variable",
"source": "dsEDIDetalle.ShipFromCountry",
"required": true
}
]
}
}
}
}
]
}
},
{
"segment_id": "L11",
"segment_name": "Business Instructions and Reference Number - BM",
"required": false,
"position": 10,
"repeat": false,
"conditional": {
"type": "if",
"condition": "clViaje.m_sIdentificador != ''",
"then": {
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "clViaje.m_sIdentificador",
"required": true
},
{
"element_id": "L1102",
"data_type": "fixed",
"value": "BM",
"required": true
}
]
}
}
},
{
"segment_id": "L11",
"segment_name": "Business Instructions and Reference Number - QN",
"required": false,
"position": 11,
"repeat": false,
"conditional": {
"type": "if",
"condition": "dsEDIDetalle.StopNum != ''",
"then": {
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "dsEDIDetalle.StopNum",
"required": true
},
{
"element_id": "L1102",
"data_type": "fixed",
"value": "QN",
"required": true
}
]
}
}
},
{
"segment_id": "L11",
"segment_name": "Business Instructions and Reference Number - 2I",
"required": false,
"position": 12,
"repeat": false,
"conditional": {
"type": "if",
"condition": "dsEDIDetalle.TrackingNum != ''",
"then": {
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "dsEDIDetalle.TrackingNum",
"required": true
},
{
"element_id": "L1102",
"data_type": "fixed",
"value": "2I",
"required": true
}
]
}
}
},
{
"segment_id": "IEA",
"segment_name": "Interchange Control Trailer",
"required": true,
"position": 15,
"repeat": false,
"elements": [
{
"element_id": "IEA01",
"data_type": "fixed",
"value": "1",
"required": true
},
{
"element_id": "IEA02",
"data_type": "variable",
"source": "m_nIdSolicitudEDI",
"format": "09d",
"transform": "num_to_string",
"required": true
}
],
"conditional_terminator": {
"condition": "system_param.SegmentoL11Penske == false",
"terminator": "~"
}
}
]
}
}

Explicación de decisiones de diseño:

  • El primer L11 usa if_else para decidir entre RN/MA según si existe RunNumber
  • L1102 dentro del primer L11 es condicional: puede ser el RunNumber mismo o “RN” según parámetro
  • MS1 usa switch para detectar estatus X6 y generar GPS, sino usa condiciones anidadas para carga/descarga
  • Los L11 adicionales (BM, QN, 2I) son opcionales con condición if simple
  • IEA tiene terminador condicional según parámetro

Referencias: Ver DOCUMENTACION-EDI-COMPLETA.md para detalles completos de variaciones PENSKE.

Ejemplo 10.2: EDI 214 - XPOLOGISTICS

carrier_id: 6
carrier_name: “XPOLOGISTICS”

Características específicas de XPOLOGISTICS:

  • ISA05/ISA07 = “02”
  • GS03 = “AETMENLOPDX ” (hardcodeado)
  • Secuencia fija de múltiples L11 (BN, IX, MB siempre presentes)
  • L11-PO repetible (loop sobre query)
  • L11-SI y L11-ST siempre presentes
  • NO incluye segmento LX
  • N1/N3/N4 hardcodeados con valores fijos
  • MS3 incluido
  • AT8 incluido
  • IEA sin terminador adicional

Template (secciones clave):

{
"edi_config": {
"carrier_id": 6,
"carrier_name": "XPOLOGISTICS",
"document_type": "214",
"segments": [
{
"segment_id": "GS",
"elements": [
{
"element_id": "GS03",
"data_type": "fixed",
"value": "AETMENLOPDX ",
"required": true
}
]
},
{
"segment_id": "L11",
"segment_name": "Business Instructions - BN",
"required": true,
"position": 5,
"repeat": false,
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "m_sIdentSolicitud",
"required": true
},
{
"element_id": "L1102",
"data_type": "fixed",
"value": "BN",
"required": true
}
]
},
{
"segment_id": "L11",
"segment_name": "Business Instructions - IX",
"required": true,
"position": 6,
"repeat": false,
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "dsEDIDetalle.LadingDecription",
"required": true
},
{
"element_id": "L1102",
"data_type": "fixed",
"value": "IX",
"required": true
}
]
},
{
"segment_id": "L11",
"segment_name": "Business Instructions - MB",
"required": true,
"position": 7,
"repeat": false,
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "m_sIdentSolicitud",
"required": true
},
{
"element_id": "L1102",
"data_type": "fixed",
"value": "MB",
"required": true
}
]
},
{
"segment_id": "L11",
"segment_name": "Business Instructions - PO (Repetible)",
"required": false,
"position": 8,
"repeat": true,
"repeat_source": "dsSolicitudesEDIDetalleL11",
"repeat_query": "GetListadoPOByIdSolicitudEDI(m_nIdSolicitudEDI)",
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "dsSolicitudesEDIDetalleL11.PO",
"required": true
},
{
"element_id": "L1102",
"data_type": "fixed",
"value": "PO",
"required": true
}
]
},
{
"segment_id": "L11",
"segment_name": "Business Instructions - SI",
"required": true,
"position": 9,
"repeat": false,
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "dsEDIDetalle.CarrierID",
"required": true
},
{
"element_id": "L1102",
"data_type": "fixed",
"value": "SI",
"required": true
}
]
},
{
"segment_id": "L11",
"segment_name": "Business Instructions - ST",
"required": true,
"position": 10,
"repeat": false,
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "dsEDIDetalle.Reference",
"required": true
},
{
"element_id": "L1102",
"data_type": "fixed",
"value": "ST",
"required": true
}
]
},
{
"segment_id": "N1",
"segment_name": "Name - SH (Hardcoded)",
"required": true,
"position": 11,
"repeat": false,
"elements": [
{
"element_id": "N101",
"data_type": "fixed",
"value": "SH",
"required": true
},
{
"element_id": "N102",
"data_type": "fixed",
"value": "LEAR CORPORATION",
"required": true
}
]
},
{
"segment_id": "N3",
"segment_name": "Address Information (Hardcoded)",
"required": true,
"position": 12,
"repeat": false,
"elements": [
{
"element_id": "N301",
"data_type": "fixed",
"value": "1110 WOODMERE AVE",
"required": true
}
]
},
{
"segment_id": "N4",
"segment_name": "Geographic Location (Hardcoded)",
"required": true,
"position": 13,
"repeat": false,
"elements": [
{
"element_id": "N401",
"data_type": "variable",
"source": "dsEDIDetalle.BillToCity",
"required": true
},
{
"element_id": "N402",
"data_type": "variable",
"source": "dsEDIDetalle.BillToState",
"required": true
},
{
"element_id": "N403",
"data_type": "variable",
"source": "dsEDIDetalle.BillToZip",
"required": true
},
{
"element_id": "N404",
"data_type": "variable",
"source": "dsEDIDetalle.BillToCountry",
"required": true
}
]
},
{
"segment_id": "MS3",
"segment_name": "Interline Service Provider",
"required": true,
"position": 14,
"repeat": false,
"elements": [
{
"element_id": "MS301",
"data_type": "variable",
"source": "dsEDIDetalle.IdentificadorSCAC",
"required": true
},
{
"element_id": "MS302",
"data_type": "fixed",
"value": "O",
"required": true
},
{
"element_id": "MS304",
"data_type": "fixed",
"value": "M",
"required": true
}
]
},
{
"segment_id": "LX",
"segment_name": "Assigned Number",
"required": true,
"position": 15,
"repeat": false,
"elements": [
{
"element_id": "LX01",
"data_type": "fixed",
"value": "1",
"required": true
}
]
},
{
"segment_id": "AT8",
"segment_name": "Shipment Status or Appointment Time",
"required": true,
"position": 16,
"repeat": false,
"elements": [
{
"element_id": "AT801",
"data_type": "variable",
"source": "dsEDIDetalle.WeightQualifier",
"required": true
},
{
"element_id": "AT802",
"data_type": "variable",
"source": "dsEDIDetalle.WeightUnitCode",
"required": true
},
{
"element_id": "AT803",
"data_type": "variable",
"source": "dsEDIDetalle.Weight",
"required": true
},
{
"element_id": "AT804",
"data_type": "variable",
"source": "dsEDIDetalle.LadingQuantity",
"required": true
}
]
}
]
}
}

Puntos clave:

  • L11-PO es repetible usando repeat: true y repeat_query
  • N1/N3/N4 tienen valores hardcodeados específicos
  • NO se incluye LX entre los L11 iniciales (difiere de otros carriers)
  • MS3 y AT8 son específicos de XPOLOGISTICS

Ejemplo 10.3: EDI 214 - PROTRANS

carrier_id: 11
carrier_name: “PROTRANS”

Características específicas de PROTRANS:

  • ISA05/ISA07 = “02”, ISA16 = ”>” (separador especial)
  • L11-BM y L11-SI siempre presentes (en ese orden)
  • N1/N3/N4 condicionales según StopReason
  • MS3 siempre presente
  • AT7 con Time Code “UT” (no “LT” ni “CT”)
  • MS2 con MS203 variable (sEquivalenciaEDIMS02)

Template (secciones clave):

{
"edi_config": {
"carrier_id": 11,
"carrier_name": "PROTRANS",
"document_type": "214",
"segments": [
{
"segment_id": "ISA",
"elements": [
{
"element_id": "ISA05",
"data_type": "fixed",
"value": "02"
},
{
"element_id": "ISA07",
"data_type": "fixed",
"value": "02"
},
{
"element_id": "ISA16",
"data_type": "fixed",
"value": ">"
}
]
},
{
"segment_id": "B10",
"elements": [
{
"element_id": "B1003",
"data_type": "variable",
"source": "m_sSCACAplicacion"
}
]
},
{
"segment_id": "L11",
"segment_name": "Business Instructions - BM",
"required": true,
"position": 5,
"repeat": false,
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "dsEDIDetalle.BOL",
"required": true
},
{
"element_id": "L1102",
"data_type": "fixed",
"value": "BM",
"required": true
}
]
},
{
"segment_id": "L11",
"segment_name": "Business Instructions - SI",
"required": true,
"position": 6,
"repeat": false,
"elements": [
{
"element_id": "L1101",
"data_type": "variable",
"source": "m_sIdentSolicitud",
"required": true
},
{
"element_id": "L1102",
"data_type": "fixed",
"value": "SI",
"required": true
}
]
},
{
"segment_id": "N1",
"segment_name": "Name - SF (Condicional)",
"required": false,
"position": 7,
"repeat": false,
"conditional": {
"type": "if",
"condition": "dsEDIDetalle.StopReason contains 'Load' OR dsEDIDetalle.StopReason contains 'Complete' OR dsEDIDetalle.StopReason contains 'Part Load'",
"then": {
"elements": [
{
"element_id": "N101",
"data_type": "fixed",
"value": "SF",
"required": true
},
{
"element_id": "N102",
"data_type": "variable",
"source": "dsEDIDetalle.ShipFromName",
"required": true
}
]
}
}
},
{
"segment_id": "MS3",
"segment_name": "Interline Service Provider",
"required": true,
"position": 8,
"repeat": false,
"elements": [
{
"element_id": "MS301",
"data_type": "variable",
"source": "sGSSCAC",
"required": true
},
{
"element_id": "MS302",
"data_type": "fixed",
"value": "O",
"required": true
},
{
"element_id": "MS304",
"data_type": "fixed",
"value": "M",
"required": true
}
]
},
{
"segment_id": "AT7",
"elements": [
{
"element_id": "AT707",
"data_type": "fixed",
"value": "UT",
"required": true
}
]
},
{
"segment_id": "MS2",
"elements": [
{
"element_id": "MS203",
"data_type": "variable",
"source": "sEquivalenciaEDIMS02",
"required": true
}
]
}
]
}
}

Puntos clave:

  • ISA16 = ”>” (separador especial)
  • L11-BM y L11-SI siempre presentes en orden fijo
  • N1/N3/N4 condicionales según StopReason
  • AT7 con Time Code “UT” específico
  • MS203 variable (no fijo “TL”)

Ejemplo 10.4: EDI 214 - SAPLBN

carrier_id: 9
carrier_name: “SAPLBN”

Características específicas de SAPLBN:

  • ISA05/ISA07 = “02”
  • NO incluye segmento MS1 (omisión específica)
  • NO incluye segmento MS2 (omisión específica)
  • Resto de segmentos según configuración estándar

Template (estructura):

{
"edi_config": {
"carrier_id": 9,
"carrier_name": "SAPLBN",
"document_type": "214",
"segments": [
{
"segment_id": "ISA",
"elements": [
{
"element_id": "ISA05",
"data_type": "fixed",
"value": "02"
}
]
},
{
"segment_id": "GS",
"elements": []
},
{
"segment_id": "ST",
"elements": []
},
{
"segment_id": "B10",
"elements": []
},
{
"segment_id": "L11",
"elements": []
},
{
"segment_id": "LX",
"elements": []
},
{
"segment_id": "AT7",
"elements": []
},
{
"segment_id": "SE",
"elements": []
},
{
"segment_id": "GE",
"elements": []
},
{
"segment_id": "IEA",
"elements": []
}
]
}
}

Punto clave: Los segmentos MS1 y MS2 simplemente NO están incluidos en la lista de segmentos del template. No hay condición que los omita, simplemente no existen en este template.


Ejemplo 10.5: EDI 997 - XPOLOGISTICS

carrier_id: 6
carrier_name: “XPOLOGISTICS”

Características específicas:

  • Incluye segmentos AK2 y AK5 adicionales (solo XPOLOGISTICS)
  • SE01 = “6” (porque incluye AK2 y AK5 adicionales)

Template (secciones clave):

{
"edi_config": {
"carrier_id": 6,
"carrier_name": "XPOLOGISTICS",
"document_type": "997",
"segments": [
{
"segment_id": "GS",
"elements": [
{
"element_id": "GS01",
"data_type": "fixed",
"value": "FA"
}
]
},
{
"segment_id": "ST",
"elements": [
{
"element_id": "ST01",
"data_type": "fixed",
"value": "997"
}
]
},
{
"segment_id": "AK1",
"elements": []
},
{
"segment_id": "AK2",
"segment_name": "Transaction Set Response Header",
"required": true,
"position": 5,
"repeat": false,
"elements": [
{
"element_id": "AK201",
"data_type": "fixed",
"value": "204",
"required": true
},
{
"element_id": "AK202",
"data_type": "variable",
"source": "dsEDIDetalle.IdentSolicitud",
"required": true
}
]
},
{
"segment_id": "AK5",
"segment_name": "Transaction Set Response Trailer",
"required": true,
"position": 6,
"repeat": false,
"elements": [
{
"element_id": "AK501",
"data_type": "fixed",
"value": "A",
"required": true
},
{
"element_id": "AK502",
"data_type": "fixed",
"value": "5",
"required": true
}
]
},
{
"segment_id": "AK9",
"elements": []
},
{
"segment_id": "SE",
"elements": [
{
"element_id": "SE01",
"data_type": "fixed",
"value": "6",
"required": true
}
]
}
]
}
}

Ejemplo 10.6: EDI 997 - RYDER

carrier_id: 1
carrier_name: “RYDER”

Características específicas:

  • IEA con terminador ”~” adicional

Template (sección IEA):

{
"segment_id": "IEA",
"elements": [
{
"element_id": "IEA01",
"data_type": "fixed",
"value": "1"
},
{
"element_id": "IEA02",
"data_type": "variable",
"source": "m_nIdSolicitudEDI",
"format": "09d",
"transform": "num_to_string"
}
],
"terminator": "~"
}

Ejemplo 10.7: EDI 990 - PENSKE

carrier_id: 5
carrier_name: “PENSKE”

Características específicas:

  • Formato estándar
  • B1 con fecha incluida (B103)
  • N9 NO incluido (específico de PENSKE)
  • K1 condicional si respuesta = “D”

Template (secciones clave):

{
"edi_config": {
"carrier_id": 5,
"carrier_name": "PENSKE",
"document_type": "990",
"segments": [
{
"segment_id": "GS",
"elements": [
{
"element_id": "GS01",
"data_type": "fixed",
"value": "GF"
}
]
},
{
"segment_id": "B1",
"elements": [
{
"element_id": "B101",
"data_type": "variable",
"source": "dsEDIDetalle.IdentificadorSCAC"
},
{
"element_id": "B102",
"data_type": "variable",
"source": "dsEDIDetalle.CarrierPro"
},
{
"element_id": "B103",
"data_type": "system_date",
"format": "YYYYMMDD"
},
{
"element_id": "B104",
"data_type": "variable",
"source": "sRespuesta"
}
]
},
{
"segment_id": "K1",
"segment_name": "Remarks - Solo si rechazado",
"required": false,
"conditional": {
"type": "if",
"condition": "sRespuesta == 'D'",
"then": {
"elements": [
{
"element_id": "K101",
"data_type": "fixed",
"value": "REJECT",
"required": true
},
{
"element_id": "K102",
"data_type": "variable",
"source": "sClaveMotivoCancelacion",
"required": true
}
]
}
}
}
]
}
}

Punto clave: N9 simplemente NO está incluido en el template (a diferencia de otros carriers).


Ejemplo 10.8: EDI 990 - AUTOLIV

carrier_id: 7
carrier_name: “AUTOLIV”

Características específicas:

  • Formato especial con terminadores ”~” después de cada segmento
  • ISA16 = ”:” (separador especial)
  • ISA15 = m_sTipo (variable, no fijo “P”)
  • N9 solo si respuesta = “A”

Template (secciones clave):

{
"edi_config": {
"carrier_id": 7,
"carrier_name": "AUTOLIV",
"document_type": "990",
"global_settings": {
"segment_terminator": "~",
"add_terminator_after_each_segment": true
},
"segments": [
{
"segment_id": "ISA",
"elements": [
{
"element_id": "ISA15",
"data_type": "variable",
"source": "m_sTipo"
},
{
"element_id": "ISA16",
"data_type": "fixed",
"value": ":"
}
]
},
{
"segment_id": "GS",
"elements": []
},
{
"segment_id": "ST",
"elements": []
},
{
"segment_id": "B1",
"elements": []
},
{
"segment_id": "N9",
"segment_name": "Reference Identification - Solo si aceptado",
"required": false,
"conditional": {
"type": "if",
"condition": "sRespuesta == 'A'",
"then": {
"elements": [
{
"element_id": "N901",
"data_type": "fixed",
"value": "CN",
"required": true
},
{
"element_id": "N902",
"data_type": "variable",
"source": "dsEDIDetalle.CarrierPro",
"required": true
}
]
}
}
}
]
}
}

Punto clave: Todos los segmentos tienen terminador ”~” adicional por configuración global.


Ejemplo 10.9: EDI 990 - OOCL

carrier_id: 8
carrier_name: “OOCL”

Características específicas:

  • Formato especial
  • ISA16 = ”>” (separador especial)
  • ISA06 = m_sSCACAplicacion (no InterchangeReceiverID)
  • ISA08 = “OOCLIES” (hardcodeado)
  • GS02 = m_sSCACAplicacion
  • GS03 = “OOCLIES”
  • B101 = m_sSCACAplicacion

Template (secciones clave):

{
"edi_config": {
"carrier_id": 8,
"carrier_name": "OOCL",
"document_type": "990",
"segments": [
{
"segment_id": "ISA",
"elements": [
{
"element_id": "ISA06",
"data_type": "variable",
"source": "m_sSCACAplicacion"
},
{
"element_id": "ISA08",
"data_type": "fixed",
"value": "OOCLIES"
},
{
"element_id": "ISA16",
"data_type": "fixed",
"value": ">"
}
]
},
{
"segment_id": "GS",
"elements": [
{
"element_id": "GS02",
"data_type": "variable",
"source": "m_sSCACAplicacion"
},
{
"element_id": "GS03",
"data_type": "fixed",
"value": "OOCLIES"
}
]
},
{
"segment_id": "B1",
"elements": [
{
"element_id": "B101",
"data_type": "variable",
"source": "m_sSCACAplicacion"
}
]
}
]
}
}

Punto clave: Múltiples campos usan valores hardcodeados o fuentes específicas diferentes al estándar.


Ejemplo 10.10: EDI 210 - Template genérico

document_type: “210”
document_description: “Motor Carrier Freight Details and Invoice”

Características del EDI 210:

  • Contexto de facturación (gnIdFactura, clFactura, clViaje)
  • GS01 = “IM” (Motor Carrier Freight)
  • Segmentos específicos: B3, C2/C3, N9, G62, H3, R3, N1/N3/N4, N7, loop LX (L5, L0, L1, L7), L3

Template (estructura base):

{
"edi_config": {
"document_type": "210",
"document_description": "Motor Carrier Freight Details and Invoice",
"data_sources": {
"main_query": "GetListadoClientesFacturacionEDI",
"required_parameters": ["gnIdFactura", "gsEmpresa", "sScacCliente"],
"additional_queries": [
{ "name": "factura", "class": "ClsProFacturas", "parameter": "gnIdFactura" },
{ "name": "folio", "class": "ClsCatFolios", "parameter": "clFactura.m_nIdFolio" },
{ "name": "cliente", "class": "ClsCatClientes", "parameter": "clFactura.m_nIdCliente" },
{ "name": "viaje", "class": "ClsProViajes", "parameter": "nIdViaje" },
{
"name": "remitente",
"class": "ClsCatRemitentesDestinatarios",
"parameter": "clViaje.m_nIdRemitente"
},
{
"name": "destinatario",
"class": "ClsCatRemitentesDestinatarios",
"parameter": "clViaje.m_nIdDestinatario"
}
]
},
"segments": [
{ "segment_id": "ISA", "elements": [] },
{
"segment_id": "GS",
"elements": [{ "element_id": "GS01", "data_type": "fixed", "value": "IM" }]
},
{
"segment_id": "ST",
"elements": [
{ "element_id": "ST01", "data_type": "fixed", "value": "210" },
{ "element_id": "ST02", "source": "gnIdFactura", "format": "04d" }
]
},
{ "segment_id": "B3", "segment_name": "Beginning Segment for Motor Freight", "elements": [] },
{
"segment_id": "C3",
"segment_name": "Currency",
"variable": true,
"options": [
{
"id": "included",
"elements": [{ "element_id": "C301", "source": "sAbreviacionMoneda" }]
},
{ "id": "excluded", "included": false }
]
},
{
"segment_id": "N9",
"segment_name": "Reference Identification",
"variable": true,
"options": [
{
"id": "po",
"elements": [
{ "element_id": "N901", "value": "PO" },
{ "element_id": "N902", "source": "clViaje.m_sNoViajeCliente" }
]
},
{
"id": "bm",
"elements": [
{ "element_id": "N901", "value": "BM" },
{ "element_id": "N902", "source": "clFolio.m_nFolioInicial" }
]
}
]
},
{
"segment_id": "G62",
"segment_name": "Date/Time Reference",
"variable": true,
"options": [
{
"id": "g62_86",
"elements": [
{ "element_id": "G6201", "value": "86" },
{
"element_id": "G6202",
"source": "clViaje.m_dtFechaCarga..Date",
"format": "YYYYMMDD"
}
]
}
]
},
{ "segment_id": "R3", "segment_name": "Route Information", "variable": true, "options": [] },
{ "segment_id": "N1", "segment_name": "Name - BT/SH/CN", "elements": [] },
{ "segment_id": "N3", "segment_name": "Address", "elements": [] },
{ "segment_id": "N4", "segment_name": "Geographic Location", "elements": [] },
{ "segment_id": "N7", "segment_name": "Equipment Details", "variable": true, "options": [] },
{
"segment_id": "LX",
"segment_name": "Loop Conceptos",
"repeat": true,
"repeat_source": "dsConceptosFacturacion",
"elements": [
{ "segment_id": "L5" },
{ "segment_id": "L0" },
{ "segment_id": "L1" },
{ "segment_id": "L7" }
]
},
{ "segment_id": "L3", "segment_name": "Total Weight and Charges", "elements": [] },
{
"segment_id": "SE",
"elements": [
{ "element_id": "SE01", "calculation": "segment_count + 1" },
{ "element_id": "SE02", "source": "gnIdFactura" }
]
},
{ "segment_id": "GE", "elements": [] },
{ "segment_id": "IEA", "elements": [] }
]
}
}

Puntos clave:

  • EDI 210 usa gnIdFactura como identificador (no m_nIdSolicitudEDI)
  • Loop LX se repite sobre conceptos de facturación (ProFacturasConceptosFacturacion)
  • Variaciones por carrier en ISA08, B3, N9, C2/C3, R3, terminadores

Referencia: Ver DOCUMENTACION-EDI-COMPLETA.md#documento-edi-210 para detalles completos.


Casos Especiales

Segmentos que se Omiten

Cuando un carrier específico NO incluye un segmento que otros carriers sí incluyen, el segmento simplemente NO está presente en la lista de segmentos del template.

Ejemplo:

  • SAPLBN EDI 214: No incluye MS1 ni MS2 → Estos segmentos no aparecen en el array segments
  • PENSKE EDI 990: No incluye N9 → N9 no aparece en el array segments
  • XPOLOGISTICS EDI 214: No incluye LX entre los L11 iniciales → LX aparece después

No se usa:

{
"conditional": {
"condition": "carrier_id != 9"
}
}

Se hace: El template de SAPLBN simplemente no incluye MS1 en su definición.

Ajuste de Contadores

Algunos carriers (TRANSPLACE, ALCLOGISTICS) usan un contador alternativo nRenglon que se decrementa cuando segmentos opcionales no se incluyen.

Representación:

{
"segment_id": "SE",
"elements": [
{
"element_id": "SE01",
"data_type": "calculated",
"calculation": "nRenglon - 1"
}
]
}

Nota: Este contador alternativo se inicializa en 9 y se decrementa cuando segmentos condicionales no se incluyen porque sus valores están vacíos.

Valores Hardcodeados Complejos

Algunos valores son strings completos hardcodeados, como direcciones o códigos GPS.

Ejemplo - Dirección hardcodeada en XPOLOGISTICS:

{
"segment_id": "N3",
"elements": [
{
"element_id": "N301",
"data_type": "fixed",
"value": "1110 WOODMERE AVE",
"hardcoded": true
}
]
}

Ejemplo - GPS hardcodeado:

{
"segment_id": "MS1",
"conditional": {
"type": "switch",
"switch_on": "clCatEstatusViajeDetalle.m_sAbreviacion",
"cases": [
{
"case": "X6",
"action": {
"type": "gps_location",
"format": "DMS",
"value": "MS1****0*0*W*N"
}
}
]
}
}

Validación y Reglas

Los templates pueden incluir reglas de validación que deben cumplirse antes de generar el documento EDI.

Estructura:

{
"validation_rules": [
{
"rule_id": "VR001",
"description": "Validar que existe IdSolicitudEDI",
"field": "m_nIdSolicitudEDI",
"validation": "not_zero",
"error_message": "El identificador de la solicitud EDI es un campo requerido"
},
{
"rule_id": "VR002",
"description": "Validar URL del servicio",
"field": "system_param.URLServiciosWEBClienteEDI",
"validation": "not_empty",
"error_message": "El URL Servicios WEB Cliente es un campo requerido"
}
]
}

Tipos de validación:

  • not_zero: El valor no debe ser cero
  • not_empty: El valor no debe estar vacío
  • not_empty_if: El valor no debe estar vacío si se cumple una condición

Referencias Cruzadas

Documentación Relacionada

  • DOCUMENTACION-EDI-COMPLETA.md: Documentación técnica completa de todos los documentos EDI, segmentos, elementos, variaciones por carrier, y fuentes de datos
  • edi.json: Ejemplo completo y funcional de un template EDI (PENSKE 214)

Código Relacionado

  • src/types/edi.types.ts: Definiciones TypeScript que implementan esta nomenclatura
  • src/lib/edi-base-templates.ts: Implementación de templates base genéricos
  • src/lib/edi-template-builder.ts: Utilidades para construir templates
  • src/ClsProSolicitudesEDI.ts: Clase TypeScript convertida del código WebDev original que contiene la lógica de negocio

Secciones Específicas de Referencia


Documentación generada: 2025-01-XX
Versión: 1.0
Basado en: Análisis del código WebDev ClsProSolicitudesEDI y documentación técnica completa