Contenido
- Ejemplos de triggers
- Crear un pedido tras una llamada perdida
- Crear una tarea tras una llamada perdida cuando ya existe un pedido
- Crear un cliente tras una llamada perdida
- Crear un cliente tras una llamada atendida
- Acordar los detalles del pedido
- Notificar un pedido vencido en «Disponibilidad confirmada»
- Iniciar la cadena de reserva automática
- Cambiar al estado que activa la reserva automática con un trigger diferido
- Gestionar una devolución
- Enviar un enlace de pago
- Procesar un pedido pagado
- Procesar un pedido preparado
- Gestionar una entrega reprogramada
- Enviar el número de seguimiento
- Notificar la llegada al punto de recogida
- Recordar la recogida después de cinco días
- Crear una tarea si el pedido sigue sin recogerse
- Agradecer un pedido completado
- Solicitar una reseña
- Notificar que el pedido está listo para recogida en tienda
- Recordar la recogida en tienda después de dos días
- Notificar la asignación de un mensajero
- Repetir el proceso de reserva automática
- Proponer una sustitución
- Notificar la recepción de un pedido
- Notificar una entrega prevista para hoy o mañana
- Expresiones útiles para triggers
En este artículo se muestran ejemplos de triggers que pueden crearse para automatizar distintos procesos, así como expresiones útiles para configurar sus condiciones y acciones. Los ajustes y fragmentos de código pueden copiarse y adaptarse a la configuración del sistema.
Para obtener información sobre la creación y el funcionamiento de los triggers, consulte los siguientes artículos:
- Creación de un trigger
- Información general sobre los triggers
- Resultados de la ejecución de los triggers
Ejemplos de triggers
Crear un pedido tras una llamada perdida
Este trigger comprueba mediante el número entrante si el cliente ya tiene un pedido. Si la llamada no se ha vinculado a ningún pedido, crea uno nuevo.
- Evento: llamada perdida.
- Condición: nuevo pedido, «Sí».
- Acción: crear un pedido.
Crear una tarea tras una llamada perdida cuando ya existe un pedido
Este trigger comprueba mediante el número entrante si el cliente ya tiene un pedido. Si existe, crea una tarea para el gestor.
- Evento: llamada perdida.
- Condición: nuevo pedido, «No».
- Acción: crear una tarea y configurar su descripción.
Crear un cliente tras una llamada perdida
Este trigger comprueba si la llamada perdida pertenece a un cliente registrado. Si el cliente no existe, lo crea.
- Evento: llamada perdida.
- Condición: nuevo cliente, «Sí».
- Acción: crear un cliente.
Crear un cliente tras una llamada atendida
Este trigger comprueba si una llamada entrante atendida pertenece a un cliente registrado. Si el cliente no existe, lo crea.
- Evento: nueva llamada.
- Condición: nuevo cliente, «Sí».
- Acción: crear un cliente.
Acordar los detalles del pedido
Cuando un pedido cambia al estado «Disponibilidad confirmada», el trigger crea una tarea para el gestor. El estado de origen puede ser cualquiera.
- Evento: cambio del pedido.
- Condición: cambio del estado del pedido desde cualquier estado a «Disponibilidad confirmada».
- Acción: crear una tarea y configurar su descripción.
Notificar un pedido vencido en «Disponibilidad confirmada»
Este trigger notifica al gestor que un pedido con el estado «Disponibilidad confirmada» ha pasado a estar vencido.
- Evento: cambio del pedido.
- Condición: se configura mediante la expresión siguiente, no mediante el constructor.
- Acción: enviar una notificación mediante una plantilla de notificación.
Código de la condición:
((changeSet.hasChangedField("expired") and changeSet.getNewValue("expired")) and (order.status.code in ['availability-confirmed']))
Iniciar la cadena de reserva automática
Cuando un pedido cambia al estado personalizado «Listo para esperar», este trigger inicia una cadena que comprueba la disponibilidad del producto al día siguiente y continúa con su reserva automática. Puede utilizarse otro estado personalizado equivalente.
- Evento: cambio del pedido.
- Condición: cambio del estado del pedido desde cualquier estado a «Listo para esperar».
- Acción: cambiar el dato «Nombre» del pedido. En la expresión de la acción se indica
order.firstNamepara volver a asignar el nombre actual y generar el evento utilizado por el siguiente trigger.
Cambiar al estado que activa la reserva automática con un trigger diferido
Nota
Este trigger está vinculado directamente con el trigger anterior.
Este trigger continúa la cadena de reserva automática y cambia el pedido al estado que inicia la reserva automática de productos.
- Evento: después de ejecutarse un trigger para el pedido.
- Condición: en el campo «Después del trigger», seleccionar el trigger anterior; en «Después de», indicar 1 día.
- Acción: cambiar el dato «Estado del pedido». En la expresión de la acción se indica el código simbólico del estado que activa la reserva automática.
Gestionar una devolución
Cuando un pedido cambia al estado «Devolución», el trigger informa al cliente de su cancelación.
- Evento: cambio del pedido.
- Condición: cambio del estado del pedido desde cualquier estado a «Devolución».
- Acciones: enviar un email mediante una plantilla de email y un SMS mediante una plantilla de SMS creadas previamente.
Enviar un enlace de pago
Este trigger envía al cliente un enlace para pagar el pedido.
¡Importante!
En lugar de
codigo_tipo_pago, debe indicarse el código simbólico del tipo de pago de la integración.
- Evento: cambio del pedido.
- Condición: se configura mediante la expresión siguiente, no mediante el constructor.
- Acciones: enviar un email mediante una plantilla de email y un SMS mediante una plantilla de SMS creadas previamente.
Código de la condición:
(changeSet.isCreate() and order.payments|contains(item => item.type.code == "codigo_tipo_pago")) or (changeSet | contains(item => item.fieldName == "payments" and item.oldValue == null and item.newValue.type.code == "codigo_tipo_pago"))
Procesar un pedido pagado
Cuando el estado del pago cambia a «Pagado», incluida una situación de pago parcial, el trigger cambia el estado del pedido a «Enviado a preparación» y crea una tarea.
- Evento: cambio del pedido.
- Condición: cambio del estado del pago desde cualquier estado a «Pagado».
- Acciones: cambiar el dato «Estado del pedido», indicando
"send-to-assembling"en la expresión, y crear una tarea.
Procesar un pedido preparado
Cuando el pedido cambia al estado «Preparado», el trigger lo transfiere al estado «Enviado a entrega».
- Evento: cambio del pedido.
- Condición: cambio del estado del pedido desde cualquier estado a «Preparado».
- Acción: cambiar el dato «Estado del pedido» e indicar
"send-to-delivery"en la expresión.
Gestionar una entrega reprogramada
Cuando el pedido cambia al estado personalizado «Entrega reprogramada», el trigger crea una tarea.
- Evento: cambio del pedido.
- Condición: cambio del estado del pedido desde cualquier estado a «Entrega reprogramada».
- Acción: crear una tarea.
Enviar el número de seguimiento
Cuando la entrega se gestiona mediante el módulo de una empresa de transporte, este trigger envía al cliente el número de seguimiento en cuanto se añade por primera vez al pedido.
- Evento: cambio del pedido.
- Condición: se configura mediante la expresión siguiente, no mediante el constructor.
- Acciones: enviar un email mediante una plantilla de email y un SMS mediante una plantilla de SMS creadas previamente.
Código de la condición:
changeSet.hasChangedField("integration_delivery_data.track_number") and changeSet.getOldValue("integration_delivery_data.track_number") == null
Notificar la llegada al punto de recogida
Cuando el pedido cambia al estado personalizado «Llegó al punto de recogida», el trigger informa al cliente.
- Evento: cambio del pedido.
- Condición: cambio del estado del pedido desde cualquier estado a «Llegó al punto de recogida».
- Acciones: enviar un email mediante una plantilla de email y un SMS mediante una plantilla de SMS creadas previamente.
Recordar la recogida después de cinco días
Nota
Este trigger está vinculado directamente con el trigger anterior.
Si el pedido continúa sin recogerse cinco días después de llegar al punto de recogida, este trigger envía un recordatorio al cliente.
- Evento: después de ejecutarse un trigger para el pedido.
- Condición: en «Después del trigger», seleccionar «Notificar la llegada al punto de recogida»; en «Después de», indicar 5 días. El estado del pedido debe ser distinto de «Completado».
- Acciones: enviar un email mediante una plantilla de email y un SMS mediante una plantilla de SMS creadas previamente.
Crear una tarea si el pedido sigue sin recogerse
Nota
Este trigger está vinculado directamente con el trigger anterior.
Si el pedido sigue sin recogerse al sexto día, este trigger crea una tarea para que el gestor averigüe el motivo.
- Evento: después de ejecutarse un trigger para el pedido.
- Condición: en «Después del trigger», seleccionar «Recordar la recogida después de cinco días»; en «Después de», indicar 1 día. El estado del pedido debe ser distinto de «Completado».
- Acción: crear una tarea.
Agradecer un pedido completado
Cuando el pedido cambia al estado «Completado», el trigger envía al cliente un mensaje de agradecimiento.
- Evento: cambio del pedido.
- Condición: cambio del estado del pedido desde cualquier estado a «Completado».
- Acciones: enviar un email mediante una plantilla de email y un SMS mediante una plantilla de SMS creadas previamente.
Solicitar una reseña
Nota
Este trigger está vinculado directamente con el trigger anterior.
Veinticuatro horas después de que el pedido cambie al estado «Completado», este trigger solicita al cliente que deje una reseña.
- Evento: después de ejecutarse un trigger para el pedido.
- Condición: en «Después del trigger», seleccionar «Agradecer un pedido completado»; en «Después de», indicar 1 día.
- Acciones: enviar un email mediante una plantilla de email y un SMS mediante una plantilla de SMS creadas previamente.
Notificar que el pedido está listo para recogida en tienda
Cuando el pedido cambia al estado personalizado «Listo para recogida en tienda», el trigger envía al cliente la dirección de la tienda y el plazo de almacenamiento.
- Evento: cambio del pedido.
- Condición: cambio del estado del pedido desde cualquier estado a «Listo para recogida en tienda».
- Acciones: enviar un email mediante una plantilla de email y un SMS mediante una plantilla de SMS creadas previamente.
Recordar la recogida en tienda después de dos días
Nota
Este trigger está vinculado directamente con el trigger anterior.
Si el pedido no se recoge en la tienda durante los dos días siguientes, este trigger informa al cliente de que el plazo de almacenamiento está a punto de finalizar.
- Evento: después de ejecutarse un trigger para el pedido.
- Condición: en «Después del trigger», seleccionar «Notificar que el pedido está listo para recogida en tienda»; en «Después de», indicar 2 días. El pedido debe conservar el estado «Listo para recogida en tienda».
- Acciones: enviar un email mediante una plantilla de email y un SMS mediante una plantilla de SMS creadas previamente.
Notificar la asignación de un mensajero
Si la entrega la realiza un mensajero propio, este trigger envía al cliente información sobre el mensajero cuando se asigna al pedido.
- Evento: cambio del pedido.
- Condición: se configura mediante la expresión siguiente, no mediante el constructor.
- Acciones: enviar un email mediante una plantilla de email y un SMS mediante una plantilla de SMS creadas previamente.
Código de la condición:
changeSet.hasChangedField("integration_delivery_data.courier") and order.deliveryType.code == "courier"
Repetir el proceso de reserva automática
Cuando el pedido cambia de «Pendiente de recepción» a «Proponer una sustitución», este trigger lo transfiere automáticamente a «Listo para esperar» para volver a ejecutar la reserva automática.
- Evento: cambio del pedido.
- Condición: cambio del estado del pedido de «Pendiente de recepción» a «Proponer una sustitución».
- Acción: cambiar el dato «Estado del pedido». En la expresión se indica el código simbólico del estado que activa la reserva automática de productos.
Proponer una sustitución
Si no hay existencias del producto y no se ejecuta la reserva automática, este trigger crea para el gestor una tarea denominada «Proponer una sustitución».
- Evento: cambio del pedido.
- Condición: cambio del estado del pedido de «Nuevo» a «Proponer una sustitución».
- Acción: crear una tarea.
Notificar la recepción de un pedido
Cuando llega un pedido nuevo, este trigger envía al cliente su número por email y SMS.
- Evento: cambio del pedido.
- Condición: nuevo pedido.
- Acciones: enviar un email mediante una plantilla de email y un SMS mediante una plantilla de SMS creadas previamente.
Notificar una entrega prevista para hoy o mañana
Si la entrega está prevista para hoy o mañana, este trigger envía una notificación al cliente.
- Evento: cambio del pedido.
- Condición: se configura mediante una de las expresiones siguientes, no mediante el constructor.
- Acciones: enviar un email mediante una plantilla de email y un SMS mediante una plantilla de SMS creadas previamente.
Condición para una entrega prevista para hoy:
changeSet.getNewValue("delivery_date").format('d.m.Y') == date('today').format('d.m.Y')
Condición para una entrega prevista para mañana:
order.getDeliveryDate().format('d.m') == date("now + 1 day").format('d.m')
Expresiones útiles para triggers
Las expresiones siguientes pueden utilizarse en las condiciones y acciones de los triggers. Los códigos simbólicos, identificadores de campos y valores de ejemplo deben sustituirse por los correspondientes a la configuración del sistema.
Trabajar con campos personalizados
Acceder a un elemento de un directorio personalizado
Código de la condición:
changeSet.hasChangedField('custom_otv_logist') and changeSet.getNewValue('custom_otv_logist') != null and order.getCustomField('otv_logist').getCode() == 'olesja'
En este ejemplo, 'olesja' es el código simbólico del elemento del directorio.
Comprobar si un campo personalizado contiene artículos de productos
Código de la condición:
order.availableOrderProducts | reduce( (sum, x) => sum or (order.getCustomField("dsa") matches '/'~x.offer.article~'/'), false)
Redondear un valor a dos decimales
Código de la acción:
round(sum, 2)
Calcular la edad del cliente
Se necesitan dos triggers: uno para los clientes cuyo cumpleaños todavía no ha ocurrido durante el año actual y otro para los clientes cuyo cumpleaños ya ha ocurrido.
- Para un cumpleaños que todavía no ha ocurrido, utilice la siguiente condición:
(changeSet.isCreate() and customer.birthday != null) or (changeSet.isUpdate() and customer.birthday != null)
date("now").format("md") < customer.birthday.format("md")
Código de la acción que establece el valor del campo personalizado con la edad:
date("now").format("Y")-customer.birthday.format("Y")-1
- Para un cumpleaños que ya ha ocurrido, utilice la siguiente condición:
(changeSet.isCreate() and customer.birthday != null) or (changeSet.isUpdate() and customer.birthday != null)
date("now").format("md") >= customer.birthday.format("md")
Código de la acción que establece el valor del campo personalizado con la edad:
date("now").format("Y")-customer.birthday.format("Y")
Trabajar con fechas y horas
Comprobar el horario laboral
Código de la condición:
(date('now') < date("today 19:00") and date('now') > date("today 02:00"))
Comprobar días laborables y fines de semana
Código de la condición:
(date('today').format('w') in ['1','2','3','4','5'] and
(date('now').format('H') < 21 or date('now').format('H') > 10 )) or
(date('today').format('w') in ['0','6'] and
(date('now').format('H') < 20 or date('now').format('H') > 12 ))
Comparar la hora de entrega con la hora actual
Código de la condición:
order.getDeliveryTime().getTo().format("H") == date("now - 4 hours").format("H")
Obtener la diferencia correspondiente a la zona horaria del cliente
Código de la acción:
((date(local_time(order.getPhone())).format("U")-date("now - 3hours").format("U"))/60)/60
Añadir días a un campo de tipo fecha
Código de la acción:
date(order.deliveryDate.format('Y-m-d H:i:s') ~ '+10 days')
Obtener desde el teléfono la zona horaria del cliente o del pedido en formato +0300
Código de la acción:
date(local_time(order.customer.phone)).format('O')
Filtrar por el día de la semana
Por ejemplo, la condición siguiente comprueba que el pedido se creó un sábado o un domingo:
order.createdAt().format('w') in [0,6]
Trabajar con números de teléfono
Para utilizar las expresiones siguientes, consulte los operadores de expresiones regulares.
Comprobar si se ha introducido un teléfono fijo
Código de la acción:
'/((8|\\+7)[\\- ]?)?(\\(?\\[495|094|499]{3}\\)?[\\- ]?)?[\\d\\- ]{7,10}/'
Comprobar si se ha introducido un teléfono móvil
Código de la acción:
'/^(8|\\+7)[ \\-\\(\\)]+9[\\d \\-\\(\\)]+$/'
Comprobar si el teléfono no corresponde al formato +7 (XXX) XXX-XX-XX
Código de la acción:
not (order.getAnyPhone() matches '/\\+7\\s\\([0-9]{3}\\)\\s[0-9]{3}-[0-9]{2}-[0-9]{2}/')
Trabajar con el contenido del pedido, almacenes y productos
Sumar valores del contenido del pedido
La expresión tiene en cuenta la cantidad de unidades de cada posición.
Código de la acción:
order.availableOrderProducts | reduce( (sum, x) => sum + x.offer.properties.amount * x.quantity )
Obtener el mayor valor de la propiedad adicional «Peso»
Código de la acción:
products | map ( x => x.weight ) | reduce ( (rez, x) => x > rez ? x : rez)
Comprobar que todos los productos del pedido están reservados
Código de la condición:
not order.availableOrderProducts | every (item => item.packs | contains (p => p))
Acceder mediante filtros pipe a una propiedad del producto añadida manualmente
El trigger comprueba que el pedido contiene productos con una propiedad y un valor determinados. La propiedad y su valor se indican mediante codigo_simbolico_propiedad y valor_propiedad.
Código de la condición:
order.orderProducts | map( x => x.properties ) | contains(item => item.bonus_spend_per_one.value matches "/-/" )
order.orderProducts | contains(item => item.properties | contains (item => item.code == 'codigo_simbolico_propiedad' and item.value == 'valor_propiedad'))
Impedir que se añada un producto en una cantidad superior a las existencias disponibles
Código de la acción:
changeSet | contains (c => c.fieldName matches '#order_product#' and (c.newValue.offer.product.quantity < c.newValue.quantity))
Impedir que la cantidad de un producto existente supere las existencias disponibles
Código de la acción:
changeSet | contains (c => c.fieldName matches '#order_product#' and (c.orderProduct.offer.quantity < c.orderProduct.quantity))
Impedir un descuento manual de importe superior al 5 % en una posición
Código de la acción:
changeSet | contains (c => c.fieldName == 'order_product.discount_manual_amount' and c.orderProduct.discountManualAmount > (c.orderProduct.price*0.05))
Comprobar si el pedido contiene un producto determinado
Código de la condición:
order_contains(order, entities_by_ids("ProductGroup", [214]))
Email, SMS y mensajes en chats
Comprobar si se abrió al menos un email enviado por el trigger principal
Código de la condición:
parent.actions | contains( action => action.letters | contains (letter => letter.isOpened))
Comprobar si no se abrió un email
Código de la condición:
parent.actions | contains( action => action.letters | contains (letter => not letter.isOpened))
Comprobar si se entregó un SMS
Código de la condición:
parent.actions | contains (action => action.sms.isDelivered)
Comprobar si no se entregó un mensaje de chat
Código de la condición:
parent.actions | contains(action => action.mgMessages | contains(message => message.isFailed))
Trabajar con pagos
Comprobar el cambio de estado de un pago determinado
Código de la condición:
changeSet | contains(item => item.fieldName == "payments.status" and item.newValue.code == "paid") and
order.payments | contains(payment => payment.type.code == "bank-card" and payment.status.code == "paid")
Impedir que se elimine un pago concreto
Código de la condición:
(changeSet.getOldValue("payments") and changeSet|contains(item => item.fieldName == "payments" and item.oldValue.type.code != "bank-card"))
Impedir que cambie el importe si existe un pago abonado
Código de la condición:
order.payments | contains(i => i.status.code == "paid") and changeSet | contains(item => item.fieldName == "payments.amount" and item.newValue)
Comprobar el cambio de un pago concreto
Esta condición comprueba que el pedido contiene un pago de tipo cash con el estado paid.
Código de la condición:
changeSet | contains ( item => item.fieldName matches '#payment\.#' and item.payment.type.code == 'cash' and item.payment.status.code == "paid")
Obtener el importe de un tipo de pago concreto
Código de la acción:
order.payments | filter(item => item.type.code == "bank-card") | reduce( (sum, x) => x.amount )
Comprobar la eliminación de un tipo de pago y la incorporación de otro
Código de la condición:
changeSet | contains(item => item.fieldName == "payments" and item.oldValue.type.code == "cash" and item.newValue == null) and changeSet | contains(item => item.fieldName == "payments" and item.oldValue == null and item.newValue.type.code == "credit")
Impedir que se elimine un pago con el estado «Pagado»
Código de la condición:
changeSet | contains(item => item.fieldName == "payments" and item.oldValue and item.oldValue.status.code == "paid" and item.newValue == null)
Impedir que cambie el importe de un pago
Código de la condición:
changeSet | contains(paym => paym.fieldName == "payments.amount" and paym.newValue != paym.oldValue and paym.oldValue != 0 and paym.type and paym.type.code in ["cash"])
Comprobar que se ha añadido un pago con un estado determinado
Código de la acción:
changeSet | contains(item => item.fieldName == "payments" and item.oldValue == null and item.newValue.type.code == "cash" and item.newValue.status.code == "paid")
Comprobar que se ha añadido un segundo pago de tipo cash
La condición comprueba que el pedido tiene al menos dos pagos de tipo cash y que acaba de añadirse uno de ellos.
Código de la condición:
((order.payments | filter(item => item.type.code == "cash")) | length) >= 2 and changeSet | contains(item => item.fieldName == "payments" and item.oldValue == null and item.newValue.type.code == "cash")
Comprobar que se ha añadido un segundo pago del mismo tipo
Esta condición no está vinculada a un tipo concreto. El trigger se ejecuta si el pedido ya tenía un pago y se añade otro del mismo tipo.
Código de la condición:
order.payments | group ( p => p.type.code ) | contains ( pp => (pp | length) > 1)
Impedir cambios en los pagos después del pago completo
Además de este trigger, se necesitan dos triggers que activen y desactiven una casilla del campo cuando cambie la fecha del pago completo.
Código de la condición:
(((changeSet.hasChangedField("payments") and changeSet.getOldValue("payments")) or (changeSet.hasChangedField("payments") and changeSet.getNewValue("payments"))) or (changeSet | contains ( item => item.fieldName matches '#payment\.#' or item.fieldName matches "/payments/"))) and order.customField('campo_con_casilla') == true
Otras expresiones
Añadir o eliminar una etiqueta
Los valores únicos de objetos, como una etiqueta, deben escribirse entre comillas dobles o simples:
"Nombre de la etiqueta"
Comprobar que el cliente se creó desde un chat
Código de la condición:
changeSet.isCreate() and customer.getMgCustomers() | contains(item => item.dialogs | contains(item => item.createdAt != null))
Utilizar operadores ternarios
Según se cumpla la condición a, b o c, la expresión escribe el valor 1, 2 o 3 en el campo correspondiente.
Código de la acción:
order.firstName == 'a' ? '1' : order.firstName == 'b' ? '2' : order.firstName == 'c' ? '3'
Asignar pedidos impares a un gestor
Código de la acción:
order.getId()%2 != 0
Comprobar que el valor de un campo no coincide con los valores indicados
Código de la condición:
not (order.getCustomerComment() matches "/(C11)|(drop1)|(MPB)|(PN)|(OPN)/")
Añadir varias correspondencias en un trigger
Código de la condición:
{
"codigo_tipo_entrega_1": "valor_correspondiente_1",
"codigo_tipo_entrega_2": "valor_correspondiente_2"
}[order.getDeliveryType().getCode()]
Calcular dinámicamente el valor de un campo
Código de la acción:
(order.payments | contains (p => p.type.code == "sber-online") ? (order.getPrepaySum()*0.05) :
(order.payments | contains (p => p.type.code == "installments") ? (order.getPrepaySum()*0.025) :
(order.payments | contains (p => p.type.code == "robokassa") ? (order.getPrepaySum()*0.05) :
(order.payments | contains (p => p.type.code == "terminal") ? (order.getPrepaySum()*0.025)))))
Comprobar que el cliente se creó hace menos de un mes
Código de la condición:
order.getCustomer().getCreatedAt() > date("30 days ago")
Comprobar el estado online del gestor responsable
Código de la condición:
user_online_status(order.getManager()) == true