Nomenclatura para Templates EDI
Tabla de Contenidos
- Introducción
- Tipos de Datos de Elementos
- Representación de Fuentes de Datos
- Lógica Condicional
- Elementos Condicionales
- Segmentos Repetibles
- Transformaciones
- Cálculos Dinámicos
- Templates Genéricos con Variaciones
- Estructura de Templates por Combinación Carrier + Documento
- Ejemplos Completos
- Casos Especiales
- Validación y Reglas
- 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_iddentro 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
""onull
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
| Prefijo | Tipo | Ejemplo | Descripción |
|---|---|---|---|
ds | Data Source | dsEDIDetalle.Reference | Resultado de queries principales |
m_ | Propiedad de clase | m_sIdentSolicitud | Propiedades de la clase ClsProSolicitudesEDI |
cl | Objeto/Clase relacionada | clViaje.m_sIdentificador | Objetos obtenidos de otras clases |
system_param | Parámetro del sistema | system_param.SegmentoL11Penske | Parámetros configurables del sistema |
Fuentes de Datos Principales
Data Sources (ds)
Resultados de queries principales que retornan datasets:
Data Source Principal:
dsEDIDetalle: Resultado deGetListadoDetalleEdiByIdSolicitudEDI()- Campos comunes:
Reference,SCAC,InterchangeReceiverID,RunNumber,StopNum, etc. - Ver
DOCUMENTACION-EDI-COMPLETA.mdpara lista completa
- Campos comunes:
Data Sources Adicionales:
dsSolicitudesEDIDetalleL11: Resultado deGetListadoPOByIdSolicitudEDI()(para L11-PO repetibles)dsUnload: Resultado deGetUnload()(solo PROTRANS)
Propiedades de Clase (m_)
Propiedades de la instancia de ClsProSolicitudesEDI:
m_nIdSolicitudEDI: ID numérico de la solicitud EDIm_sIdentSolicitud: Identificador string de la solicitudm_sCarrierPro: Carrier Pro stringm_sSCACAplicacion: SCAC de aplicaciónm_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 viajeclViaje.m_nIdCliente: ID del clienteclViaje.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 estatusclProViajesEstatus.m_dtFechaHora..Time: Hora del estatusclProViajesEstatus.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 deClsCatUnidades::GetCodigoByIdUnidad()nCargaDescargaTMP: Tipo de carga/descarga temporalsUltimaUbicacion: 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_nCondicionesPagoclFactura.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_sNoExteriorclCliente.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_dtFechaEntregaclViaje.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=2sAbreviacionMoneda: “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 falsesystem_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 == truenCargaDescargaTMP == 1dsEDIDetalle.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:trueindica que el segmento puede repetirserepeat_source: Nombre del data source que contiene los múltiples valoresrepeat_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 originallength: Longitud deseadapad_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 convertirformat: 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: Latitudlongitude: 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 momentonContadorST_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 segmentosnContadorST_SE + 1: Suma 1 al contador específiconRenglon - 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 carriercarrier_name: Nombre del carrierdocument_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
-
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)
-
Segmentos incluidos u omitidos:
- SAPLBN no incluye MS1 ni MS2
- XPOLOGISTICS no incluye LX
- Algunos carriers incluyen segmentos adicionales (N1/N3/N4, MS3, AT8)
-
Condiciones internas:
- Basadas en datos, estatus, campos
- No basadas en carrier (ya que el template es específico del carrier)
-
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.jsonque 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_elsepara 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
switchpara detectar estatus X6 y generar GPS, sino usa condiciones anidadas para carga/descarga - Los L11 adicionales (BM, QN, 2I) son opcionales con condición
ifsimple - 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: trueyrepeat_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
gnIdFacturacomo 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 ceronot_empty: El valor no debe estar vacíonot_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 nomenclaturasrc/lib/edi-base-templates.ts: Implementación de templates base genéricossrc/lib/edi-template-builder.ts: Utilidades para construir templatessrc/ClsProSolicitudesEDI.ts: Clase TypeScript convertida del código WebDev original que contiene la lógica de negocio
Secciones Específicas de Referencia
- EDI 214 completo:
DOCUMENTACION-EDI-COMPLETA.md#documento-edi-214 - EDI 997:
DOCUMENTACION-EDI-COMPLETA.md#documento-edi-997 - EDI 990:
DOCUMENTACION-EDI-COMPLETA.md#documento-edi-990 - EDI 210:
DOCUMENTACION-EDI-COMPLETA.md#documento-edi-210 - Variaciones por Carrier:
DOCUMENTACION-EDI-COMPLETA.md#matriz-de-variaciones
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