Capítulo 5: TransactionEvent y TransformationEvent
TransactionEvent
Para qué sirve
El TransactionEvent asocia objetos EPCIS con documentos comerciales: órdenes de compra, facturas, avisos de despacho, conocimientos de embarque. Mientras que un ObjectEvent dice “estos productos fueron despachados”, un TransactionEvent dice “estos productos están vinculados a la factura INV-2026-001”.
Business Transaction Types
El CBV define tipos estándar de documentos comerciales:
| Tipo | Nombre completo | Uso |
|---|---|---|
po | Purchase Order | Orden de compra del comprador |
inv | Invoice | Factura del vendedor |
desadv | Despatch Advice | Aviso de despacho (ASN) |
receadv | Receiving Advice | Confirmación de recepción |
bol | Bill of Lading | Conocimiento de embarque |
pedigree | Pedigree | Historial de custodia (farmacia) |
prodorder | Production Order | Orden de producción |
Campos del TransactionEvent
Los campos son similares a ObjectEvent, con la diferencia clave de que bizTransactionList es obligatorio (en ObjectEvent es opcional):
| Campo | Tipo | Descripción |
|---|---|---|
epcList | string[] | EPCs vinculados a los documentos |
bizTransactionList | object[] | Documentos comerciales (obligatorio) |
action | string | ADD, DELETE u OBSERVE |
parentID | string | Opcional, para jerarquías |
Ejemplo: receiving con PO y factura
Items recibidos y vinculados tanto a la orden de compra como a la factura:
{
"type": "TransactionEvent",
"eventTime": "2026-03-21T11:00:00Z",
"eventTimeZoneOffset": "-03:00",
"epcList": ["urn:epc:id:sgtin:0614141.107340.2026001"],
"action": "ADD",
"bizStep": "receiving",
"disposition": "in_progress",
"bizTransactionList": [
{
"type": "po",
"bizTransaction": "urn:epcglobal:cbv:bt:0614141073467:PO-2026-001"
},
{
"type": "inv",
"bizTransaction": "urn:epcglobal:cbv:bt:0614141073467:INV-2026-001"
}
]
}
Las acciones en TransactionEvent
| Acción | Significado |
|---|---|
ADD | Los EPCs se asocian a los documentos listados |
DELETE | Los EPCs se desvinculan de los documentos (devolución, corrección) |
OBSERVE | Se constata la asociación existente |
Cuándo usar TransactionEvent vs ObjectEvent
La diferencia es sutil pero importante:
- ObjectEvent con bizTransactionList: el foco es el evento físico (shipping), y la PO es contexto adicional
- TransactionEvent: el foco es la relación con el documento. Se usa cuando lo relevante es vincular o desvincular productos con documentos comerciales
En la práctica, muchas implementaciones usan solo ObjectEvent con bizTransactionList y prescinden del TransactionEvent. Ambos enfoques son válidos según el estándar.
TransformationEvent
Para qué sirve
El TransformationEvent registra procesos irreversibles donde unos inputs se convierten en otros outputs: manufactura, mezclado, corte, cocción, ensamblaje. Es el único evento EPCIS donde los EPCs de entrada y salida son diferentes.
Diferencia fundamental con AggregationEvent
| AggregationEvent | TransformationEvent | |
|---|---|---|
| Naturaleza | Reversible | Irreversible |
| Objetos | Los mismos antes y después | Distintos antes y después |
| Ejemplo | Meter items en caja → sacarlos | Mezclar ingredientes → producto terminado |
| Identidad | Los hijos conservan su identidad | Los inputs dejan de existir, los outputs son nuevos |
Campos específicos
| Campo | Tipo | Descripción |
|---|---|---|
inputEPCList | string[] | EPCs de materias primas/inputs serializados |
outputEPCList | string[] | EPCs de productos terminados/outputs serializados |
inputQuantityList | object[] | Inputs no serializados (granel, por lote) |
outputQuantityList | object[] | Outputs no serializados |
transformationID | string | UUID que agrupa eventos de transformación relacionados |
El TransformationEvent no tiene campo action. Toda transformación es implícitamente una creación de outputs a partir de inputs.
Ejemplo completo: manufactura con cantidades
Un proceso donde 100 kg de materia prima se transforman en 85 kg de producto terminado (15 kg de merma):
{
"type": "TransformationEvent",
"eventTime": "2026-03-21T14:00:00Z",
"eventTimeZoneOffset": "-03:00",
"inputEPCList": [
"urn:epc:id:sgtin:0614141.107340.MATERIA001"
],
"outputEPCList": [
"urn:epc:id:sgtin:0614141.107341.PRODUCTO001",
"urn:epc:id:sgtin:0614141.107341.PRODUCTO002"
],
"inputQuantityList": [
{
"epcClass": "urn:epc:class:lgtin:0614141.107340.LOTEMAT",
"quantity": 100.0,
"uom": "KGM"
}
],
"outputQuantityList": [
{
"epcClass": "urn:epc:class:lgtin:0614141.107341.LOTEPROD",
"quantity": 85.0,
"uom": "KGM"
}
],
"bizStep": "commissioning",
"disposition": "active",
"readPoint": { "id": "urn:epc:id:sgln:0614141.07346.PLANTA1" },
"transformationID": "urn:uuid:a9b8c7d6-e5f4-3210-9876-543210fedcba"
}
Desglose del ejemplo
inputEPCList: la materia prima serializada que se consumeinputQuantityList: 100 kg de un lote de materia prima (LGTIN identifica clase + lote)outputEPCList: dos unidades nuevas de producto terminado (nuevos SGTINs)outputQuantityList: 85 kg del lote de producto terminadotransformationID: UUID que identifica este proceso de transformación. Si la transformación requiere múltiples eventos (ej: varios pasos de manufactura), todos comparten el mismotransformationIDbizStep: "commissioning": los productos terminados están siendo activados por primera vezdisposition: "active": los outputs quedan activos y disponibles
El campo transformationID
Cuando un proceso de manufactura tiene múltiples etapas, cada etapa genera un TransformationEvent diferente, pero todos comparten el mismo transformationID:
Evento 1: Mezcla de ingredientes → transformationID: "urn:uuid:abc123"
Evento 2: Cocción de la mezcla → transformationID: "urn:uuid:abc123"
Evento 3: Empaque del producto final → transformationID: "urn:uuid:abc123"
Esto permite consultar todos los eventos de una misma producción con un solo filtro.
Casos de uso
| Industria | Proceso | Inputs | Outputs |
|---|---|---|---|
| Alimentos | Mezcla de ingredientes | Harina, agua, levadura | Pan empacado |
| Textil | Corte de tela | Rollo de tela | Piezas cortadas |
| Farmacia | Formulación | Principios activos, excipientes | Comprimidos |
| Electrónica | Ensamblaje | Componentes (PCB, chips) | Dispositivo ensamblado |
| Bebidas | Mezclado y embotellado | Concentrado, agua, azúcar | Botellas de refresco |
AssociationEvent (EPCIS 2.0)
EPCIS 2.0 introduce un nuevo tipo: el AssociationEvent. Registra relaciones no físicas entre objetos:
- Un sensor IoT asociado a un pallet (el sensor viaja con el pallet pero no está “dentro” de él)
- Un certificado digital asociado a un lote de producto
- Un dispositivo de monitoreo asociado a un contenedor refrigerado
{
"type": "AssociationEvent",
"eventTime": "2026-03-21T08:00:00Z",
"eventTimeZoneOffset": "-03:00",
"parentID": "urn:epc:id:sscc:0614141.1234567890",
"childEPCs": [
"urn:epc:id:giai:0614141.SENSOR-TEMP-001"
],
"action": "ADD",
"bizStep": "associating"
}
La diferencia con AggregationEvent: la asociación es lógica, no física. El sensor no está “empacado dentro” del pallet, está asociado a él para monitoreo.
Resumen de los 5 tipos de evento
| Tipo | Pregunta que responde | Ejemplo |
|---|---|---|
| ObjectEvent | ¿Qué le pasó a estos objetos? | Shipping, receiving, inspección |
| AggregationEvent | ¿Qué contiene este contenedor? | Packing, unpacking |
| TransactionEvent | ¿Con qué documentos se relacionan? | Vincular a PO, factura |
| TransformationEvent | ¿De qué se hizo este producto? | Manufactura, mezclado |
| AssociationEvent | ¿Qué está asociado lógicamente? | Sensor ↔ pallet |
Próximo capítulo
En el capítulo 6 compararemos los dos formatos de EPCIS 2.0: XML vs JSON-LD, con el mismo evento en ambas representaciones.