Conjunto de cambios
Copiar enlace al artículo
Copiado

Contenido

  1. Uso del objeto changeSet
  2. Obtención de los valores modificados
  3. Cambios en campos personalizados
  4. Autor y fuente de un cambio
  5. Seguimiento de cambios mediante filtros pipe

Uso del objeto changeSet

El objeto changeSet de tipo Change\EntityChangeSet permite obtener información sobre los cambios realizados al editar un objeto, por ejemplo, un pedido o un cliente.

Para determinar qué operación se está realizando con un objeto, están disponibles los siguientes métodos:

changeSet.isCreate() # Creación
changeSet.isUpdate() # Modificación
changeSet.isDelete() # Eliminación

Por ejemplo, si en un trigger o una validación de pedido se especifica la condición changeSet.isCreate(), esta se cumple al crear el pedido.

Obtención de los valores modificados

Los métodos más utilizados son:

  • hasChangedField(): comprueba si un campo ha cambiado;
  • oldValue(): devuelve el valor anterior del campo;
  • newValue(): devuelve el valor nuevo del campo.

El siguiente ejemplo comprueba que haya cambiado el estado del pedido y que su nuevo código sea complete:

changeSet.hasChangedField("status") and changeSet.newValue("status").code == "complete" # El estado del pedido ha cambiado y su nuevo valor es "Completado"

Los métodos reciben como parámetro el nombre de servicio del campo en formato underscore. Si es necesario acceder a un campo anidado, los niveles se separan mediante un punto.

Comprobación de campos anidados

El siguiente ejemplo comprueba que haya cambiado el estado del pedido y que el nuevo estado pertenezca al grupo con el código complete:

changeSet.hasChangedField("status") and changeSet.newValue("status").group.code == "complete" # El nuevo estado pertenece al grupo "Completado"

En la expresión se accede al objeto group, anidado en status, y después a su campo code.

Diferencia entre un cambio y el valor actual

Es importante distinguir entre la comprobación de un cambio:

changeSet.hasChangedField("delivery_type") and changeSet.newValue("delivery_type").code == "correos" # El tipo de entrega ha cambiado a "Correos"

y la comprobación del valor actual del campo:

order.deliveryType.code == "correos" # El tipo de entrega actual es "Correos"

La primera condición solo se cumple cuando el tipo de entrega cambia a correos. La segunda se cumple mientras el pedido tenga ese tipo de entrega, incluido cualquier cambio posterior del pedido, hasta que se seleccione otro tipo.

Nota

correos es un código simbólico de ejemplo. En una condición real debe especificarse el código del tipo de entrega configurado en el sistema.

Ejemplos de campos

Los siguientes ejemplos muestran cómo comprobar cambios y obtener valores:

changeSet.hasChangedField("status") # Comprueba si ha cambiado el estado del pedido
changeSet.oldValue("delivery_cost") # Obtiene el coste de entrega anterior
changeSet.newValue("delivery_address.city") # Obtiene la nueva ciudad de entrega
changeSet.hasChangedField("delivery_type") and changeSet.newValue("delivery_type").code == "correos" # Comprueba que el tipo de entrega haya cambiado a "Correos"

Estos nombres de servicio corresponden a los siguientes campos del pedido:

order.status # Estado del pedido
order.deliveryCost # Coste de entrega
order.deliveryAddress.city # Ciudad de entrega
order.deliveryType # Tipo de entrega

Cambios en campos personalizados

Los cambios en los campos personalizados se almacenan con el prefijo custom_. Por ejemplo, para comprobar si ha cambiado el campo personalizado con el código transaction_id, se utiliza la siguiente condición:

changeSet.hasChangedField("custom_transaction_id")

Importante!

Al utilizar newValue() u oldValue() con campos personalizados de tipo «Número» o «Número entero», los valores se devuelven en formato numérico. Para los demás tipos de campos personalizados, los valores se devuelven como texto.

Los ejemplos para los distintos tipos de campos personalizados están disponibles en el artículo «Cómo usar un conjunto de cambios para diferentes tipos de campos».

Autor y fuente de un cambio

Autor del cambio

La función authorOfChange() devuelve el usuario que realizó un cambio (User). Si el cambio se realizó mediante el sistema, la API o un trigger, devuelve null.

changeSet.authorOfChange("status")

Si un usuario del sistema cambia el estado del pedido, la expresión devuelve el objeto User correspondiente.

Fuente del cambio

La función sourceOfChange() devuelve el código simbólico de la fuente que modificó un campo:

api # API
user # Usuario
rule # Trigger
code # Sistema
combine # Combinación con otro objeto
copy # Copia de objetos

La siguiente condición se cumple si el estado del pedido se modificó mediante la API o un trigger:

changeSet.sourceOfChange("status") in ["api", "rule"]

Para comprobar si el conjunto contiene algún cambio procedente de una fuente determinada, se utiliza hasChangesWithSource():

changeSet.hasChangesWithSource("api")

Esta condición se cumple si el cambio se inició mediante la API.

Seguimiento de cambios mediante filtros pipe

El objeto changeSet es un conjunto de datos. Por tanto, se pueden utilizar filtros pipe para comprobar los cambios de los elementos que contiene.

El siguiente ejemplo comprueba si el estado de algún producto del pedido ha cambiado de new a rechazado:

changeSet | contains (product => product.fieldName == 'order_product.status' and product.oldValue.code == 'new' and product.newValue.code == 'rechazado')

La condición se cumple si al menos un producto del pedido presenta ese cambio de estado.

Nota

rechazado es un código simbólico de ejemplo. En una condición real debe especificarse el código del estado de producto configurado en el sistema.

Gracias por tus comentarios.
¿Te resultó útil este artículo
No
  • Рекомендации не помогли
  • Нет ответа на мой вопрос
  • Текст трудно понять
  • Не нравится описанный функционал
Si
Artículo siguiente
Cómo usar un conjunto de cambios para diferentes tipos de campos.
Los campos en el sistema pueden ser de diferentes tipos y, en consecuencia, la verificación del valor de un campo en el historial será diferente según su tipo. Hablemos con más detalle sobre cómo organizar el trabajo con cada uno de los tipos de campo disponibles.