Contenido
- Uso del objeto
changeSet - Obtención de los valores modificados
- Cambios en campos personalizados
- Autor y fuente de un cambio
- 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
correoses 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()uoldValue()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
rechazadoes 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.