Antes de comenza, para poder ejecutar las configuraciones a continuación, se sugiere dominar los conceptos de variables en Zenvia Bots y, sobre todo, la estructura Json (artículo).
Las declaraciones de variables siempre estarán estructuradas en Json de la siguiente manera:
"variables": {
"variable_nueva": "valor",
"variable_nueva2": "valor2"
},
Nombre automático en WhatsApp
En un flujo del canal de WhatsApp, es posible absorber automáticamente los datos, ya que aparecerá el nombre registrado en el WhatsApp del usuario, sin necesidad de declarar ninguna variable.
Nombre de la variable (a su elección), ejemplo: 'nombre_whats'
Valor: visitor.firstName
Imprimir: #{visitor.firstName}
"variables": {
"nombre_whats": "visitor.firstName"
},
Número automático en WhatsApp
En un flujo del canal de WhatsApp, si se declara una variable con el nombre "telefone_whats", por ejemplo, simplemente inserte su valor como "from" y el número de teléfono se mostrará automáticamente.
Nombre de la variable (a su elección), ejemplo: 'telefono_whats'
Valor: from
Imprimir: #{from}
"variables": {
"telefono_whats": "from"
},
Obtener la hora actual
Permite insertar la hora actual GMT-3 (Brasil) en una variable.
Nombre de la variable (a su elección), ejemplo: 'horaInicial'
Valor: #time.format((#time.now()).minusHours(3), 'HH:mm:ss')
Imprimir: #{horaInicial}
"variables": {
"horaInicial": "#time.format((#time.now()).minusHours(3), 'HH:mm:ss')"
},
Obtener la fecha actual
Permite insertar la fecha actual en una variable.
Nombre de la variable (a su elección), ejemplo: 'fechaInicial'
Valor: T(java.time.LocalDate).now().format(T(java.time.format.DateTimeFormatter).ofPattern('dd/MM/yyyy'))
Imprimir: #{fechaInicial}
"variables": {
"fechaInicial": "T(java.time.LocalDate).now().format(T(java.time.format.DateTimeFormatter).ofPattern('dd/MM/yyyy'))"
},
Obtener el día de la semana
Permite asignar los valores de los días de la semana en inglés: MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY a una variable.
Nombre de la variable (a su elección), ejemplo: 'diaSemana'
Valor: T(java.time.LocalDateTime).now(T(java.time.ZoneId).of('America/Sao_Paulo'))
Imprimir: #{diaSemana.toString()}
"variables": {
"diaSemana": "T(java.time.LocalDateTime).now(T(java.time.ZoneId).of('America/Sao_Paulo'))"
},
Imprimir el valor de un mapa (LinkedHashMap) como cadena de texto
Existen respuestas de API que no son cadenas de texto y, por lo tanto, no se pueden imprimir durante el flujo en Flow. Por lo tanto, simplemente agregue ".toString()" al final de la variable y podrá mostrar los datos.
variavel recibe response.toString()
O, a partir de cualquier retorno, se puede imprimir directamente en el mensaje:
Imprimir: #{variavel.toString()}
Extraer el historial de conversación hasta un momento X
El historial se organizará en el momento en que se configure el valor de la expresión a continuación. Es decir, podrá capturar todo lo que se ha conversado en el flujo hasta el momento de la declaración de la variable en el componente.
Nombre de la variable (a su elección), ejemplo: 'historico'
Valor: #stateFunction.get(session['sessionId'])
"variables": {
"historico": "#stateFunction.get(session['sessionId'])"
},
Declarar la variable y luego imprimirla en el flujo o hacer lo que desee. Por ejemplo: enviarla como contenido en una llamada de API a otro sistema.
Ejemplo de la impresión completa del historial:
Código Json:
"defaultConversationalChannel": "CHAT",
"historic": true
}
Código del flujo de pruebas, para su conocimiento:
{
"alias": "Prueba General Boeira",
"description": "",
"steps": [
{
"id": "idEventoInicial",
"type": "chatEvent",
"label": "Evento inicial",
"properties": {
"startEvent": "true"
},
"variables": {
"chatFrom": "ID_WEBCHAT_AQUI"
},
"conditions": [
{
"type": "channelSourceCondition",
"values": [
"ID_WEBCHAT_AQUI"
]
}
]
},
{
"id": "idEventoFinal",
"type": "endEvent",
"label": "Etiqueta 3",
"properties": {
"endEvent": "true"
}
},
{
"id": "step0",
"type": "sendChatActivity",
"properties": {
"from": "#{session['chatFrom']}"
},
"contents": [
{
"type": "text/plain",
"payload": {
"text": "Comenzó la conversación..."
}
}
]
},
{
"id": "step02",
"type": "callComponent",
"properties": {
"componentId": "4d242136-a4e2-46b2-bf4f-77a7a265e622",
"timeUnit": "minuto",
"expirationInMinutes": ""
},
"inputs": {
"question": "'¿Cuál es su correo electrónico?'",
"max_tries": "3",
"question_when_invalid_answer": "'No entendí, ¿podría proporcionar su correo electrónico? (Ejemplo: abc@dominio.com)'",
"message_exhausted_attempts": "'Lamentablemente, no pude entender su correo electrónico.'"
},
"label": "Validar Correo Electrónico"
},
{
"id": "step03",
"type": "sendChatActivity",
"properties": {
"from": "#{session['chatFrom']}"
},
"contents": [
{
"type": "text/plain",
"payload": {
"text": "Por favor, responda algo..."
}
}
]
},
{
"id": "step04",
"type": "chatEvent",
"variables": {
"answer": "payload"
}
},
{
"id": "step05",
"type": "nop",
"properties": {
"timeUnit": "minuto",
"expirationInMinutes": ""
},
"variables": {
"historico": "#stateFunction.get(session['sessionId'])"
}
},
{
"id": "step06",
"type": "sendChatActivity",
"properties": {
"from": "#{session['chatFrom']}"
},
"contents": [
{
"type": "text/plain",
"payload": {
"text": "Historial de conversación:\n#{historico}"
}
}
]
}
],
"connections": [
{
"from": "idEventoInicial",
"to": "step0"
},
{
"from": "step0",
"to": "step02"
},
{
"from": "step02",
"to": "step03"
},
{
"from": "step03",
"to": "step04"
},
{
"from": "step04",
"to": "step05"
},
{
"from": "step05",
"to": "step06"
},
{
"from": "step06",
"to": "idEventoFinal"
}
],
"defaultConversationalChannel": "CHAT",
"historic": true
}
Verificar el tamaño del array
Puede imprimir el tamaño del array del response (retorno de la llamada) después de una llamada de API.
Nombre de la variable (a su elección), ejemplo: 'tamanho_array'
Valor: response.size
Imprimir: #{response.size()}
"variables": {
"tamanho_array": "response.size"
}
Recortar una palabra o un retorno de API (substring)
Permite al usuario controlar el número de caracteres del texto y asignarlo a otra variable, un valor recortado. Muy utilizado para el manejo de números o información muy larga.
Nombre de la variable (a su elección), ejemplo:
"valor_entrada": "response",
"valor1_cortado": "valor_entrada.substring(0,3)"
Esto significa que la variable valor1_cortado tendrá el valor de los caracteres desde la posición 0 hasta la 3 de la variable original valor_entrada.
"variables": {
"valor_entrada": "response",
"valor1_cortado": "valor_entrada.substring(0,3)"
}
Agregar un punto en medio de una cadena de texto
A partir del ejemplo anterior, podemos concatenar dos variables insertando un punto u otros datos en el medio. La regla utilizada para esto es .concat('XXX').
valor_entrada recibe payload
valor1 recibe valor_entrada.substring(0,3)
valor2 recibe valor_entrada.substring(3,6)
valorFinal recibe valor1.concat('.').concat(valor2)
"variables": {
"valor_entrada": "payload",
"valor1": "valor_entrada.substring(0,3)",
"valor2": "valor_entrada.substring(3,6)",
"valorFinal": "valor1.concat('.').concat(valor2)"
},
Transformar valor float em moneda
Al recibir un valor de la API en formato float, es posible convertirlo a la moneda actual. Por ejemplo:
La API devuelve un valor y se crea la variable parcela1 = 2802.2367052945056
Cree la variable varFloat, que recibe new java.lang.Float(parcela1)
Cree la variable decimalInst, que recibe new java.text.DecimalFormat('R$ #,###.00', new java.text.DecimalFormatSymbols(new java.util.Locale('pt','BR'))).format(varFloat)
"variables": {Y imprima la variable decimalInst, que tendrá el valor de R$ 2.802,24, como se muestra en el ejemplo:
"varFloat": "new java.lang.Float(parcela1)",
"decimalInst": "new java.text.DecimalFormat('R$ #,###.00', new java.text.DecimalFormatSymbols(new java.util.Locale('pt','BR'))).format(varFloat)"
},
{decimalInst}
Asignar a una variable el valor de los objetos de un array, listándolos sin necesidad de un bucle
Es posible declarar las variables maxPedidos, contador, nroPedidos (nomenclatura libre para su elección) en el componente de variables y luego gestionar los datos para absorber la respuesta.
"variables": {
"maxPedidos": "response.obj.json.size()",
"contador": "0",
"nroPedidos": "response.obj.json.![PEDIDO]"
}
Convertir una cadena de texto a entero
"variables": {
"variavel": "payload",
"variavel_int": "function.extractInteger(variavel_string)"
}
Realizar operaciones matemáticas a partir de una cadena de texto
Utilizamos la función function.extractInteger (variavel_fluxo) para convertir el valor (cadena de texto) entre paréntesis recopilado durante el flujo en un número y así realizar operaciones matemáticas utilizando: +, -, *, o /.
Por ejemplo, para calcular el valor total de las camisetas:
Cree una variable que reciba el valor unitario y otra que reciba la cantidad de camisetas.
"valorUnitario": "12",
"qtCamisetas": "2",
"calculoFinal": "function.extractInteger(valorUnitario) * function.extractInteger(qtCamisetas)"
En este caso, multiplicaremos valorUnitario por qtCamisetas y el valor de la variable calculoFinal será el número final.
"variables": {
"valorUnitario": "12",
"qtCamisetas": "2",
"calculoFinal": "function.extractInteger(valorUnitario) * function.extractInteger(qtCamisetas)"
}
Vídeo incrustado en el flujo
Insertar un vídeo en el cuerpo del mensaje del bot.
<iframe width="560" height="315" src="https://www.youtube.com/embed/XXXXXXX" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
If ternario
Si es necesario realizar validaciones de asociaciones de valores, utilice este fragmento en Json. La palabra "payload" ejemplifica cualquier nombre de variable que haya en el flujo, y todo lo que está entre comillas simples son los valores en cadena de los retornos. Por ejemplo:
"variables":{
"variavel_final": "payload == '1' ? 'Agendamento' : payload == '2' ? 'Compras' : payload == '3' ? 'Financeiro' : payload == '4' ? 'Comercial' : payload == '5' ? 'SAC' : payload == '6' ? 'Unidade BR' : payload == '7' ? 'Unidad USA' : payload"
}
Ejemplo de pronóstico del tiempo, a partir del retorno de una API y sus valores:
"variables": {
"icone1": "previsao_condition1 == 'clear_day' ? '☀️' : previsao_condition1 == 'cloudy_day' ? '⛅️' : previsao_condition1 == 'rain' ? '🌧️': '☁️'",
"icone2": "previsao_condition2 == 'clear_day' ? '☀️' : previsao_condition2 == 'cloudy_day' ? '⛅️' : previsao_condition2 == 'rain' ? '🌧️': '☁️'",
"icone3": "previsao_condition3 == 'clear_day' ? '☀️' : previsao_condition3 == 'cloudy_day' ? '⛅️' : previsao_condition3 == 'rain' ? '🌧️': '☁️'"
}
Cómo crear un bucle de intentos
Es posible declarar variables que cuenten a partir de un número determinado y, a partir del tratamiento del flujo, cuando llegue al número X especificado, la jornada se direccionará. Por ejemplo:
Cree una variable con un nombre (a su elección): 'tentativa'
Inserte en la variable 'tentativa' el valor 0 (cero), que representa el punto de partida.
Si la validación en el Punto de Decisión es inválida (el usuario cometió un error al escribir o cualquier otra regla en el tratamiento de inválidos), es posible agregar +1 a la variable 'tentativa', quedando "tentativa" recibe session ['tentativa']+1. Inserte esta regla en el Json del Tratamiento de Inválido.
"variables": {
"tentativa": "tentativa +1"
}
Es decir, la variable 'tentativa' recibe ella misma +1.
Y en el branch (decisión), para limitar el número de iteraciones, inserte una regla, como por ejemplo:
Limite de tentativas: session['tentativa'] > 3
En el ejemplo anterior, el bucle continuará mientras la variable no sea mayor que 3.
Etiqueta HTML de hipervínculo en WebChat
html <a href="https://html.com/attributes/a-href/">Aprenda sobre el atributo a href</a>
Validar los 3 dígitos del CPF según el archivo de envío
Es posible verificar tanto el dato del archivo como el dato que el cliente ingresó. Simplemente use la función substring que validará lo que el cliente ingresó con el CPF.
Puede confirmar el CPF completo o la cantidad que desee, simplemente cambie el 3 (3 primeros dígitos) por un número hasta 11.
En el branch / decisión:
confirmaCpf == attribute['cpf'].substring(0,3)
confirmaCpf, en este caso, es la respuesta final del cliente (variable).
El CPF del archivo se encuentra en la variable 'cpf', que contiene 11 dígitos.
Por lo tanto, la validación consiste en verificar si en las tres primeras posiciones de 'cpf' se encuentra lo que ingresó el cliente.
Igualar una cadena de texto a otra (resultado booleano - verdadero o falso)
confirmacpf.substring(0,3).equals(session['website']['extra']['cpf'].substring(0,3))
Comparar dos cadenas de texto al mismo tiempo
Resp4_ValorResidencial matches '\d*' && T(Float).parseFloat(Resp4_ValorResidencial) > 60000.0
Potenciación3.power(expoente)
Recortar una cadena de texto hasta un carácter separador
{frase.substring(0,frase.indexOf("."))}
Aislar el número sin formato
#{dividas.replaceAll('[\\D]*([0-9.]+).*', '$1').replaceAll('\\.', '')}
Probar cada carácter de la cadena de texto para ver si está compuesta solo por espacios en blanco
string.isBlank(variável)
Validar valor monetario (sólo la parte entera)
payload.replaceAll('[\D]([0-9.]+).', '$1').replaceAll('\.', '')
Limpiar formato y obtener solo el número
(VARIABLE.replaceAll("[^0123456789]", "")) <= 10
Cortar una cadena a partir de un carácter específico
#{answer.substring(answer.indexOf(".")+1)}
String: usuario.um
Resultado de la función: um
Validar si la cadena tiene exactamente la longitud X de caracteres
variavel.length() == 7
Generar un número aleatorio
"variavel_token": "#random.randomNumeric(10)"