Se trata de una demostración de cómo se pueden utilizar tablas de decisión en diagramas de procesos Bonita BPM.
El escenario es un formulario en el que se introducen edad e ingresos anuales estimados. Más o menos, con esa información se deriva al usuario en una oferta no detallada más que en el título. Hay 3 ofertas: básica, normal y premium. El que se le ofrezca una u otra depende de la combinación de valores de las dos variables anteriores, y según la siguiente tabla, se le ofrecerá una de ellas.
Contratante
nombre STRING
apellidos STRING
teléfono STRING
edad INTEGER
ingresos INTEGER
La instanciación será un formulario con edad e ingresos. Para ello necesitamos establecer la variable de negocio.
variable de negocio: vnContratante - com.company.model.Contratante
Como datos iniciales del proceso, pediremos edad e ingresos.
Generamos uno, que llamaremos fcontratante.
No lo editamos, lo dejamos tal cual nos lo presente UIDesigner.
Para conseguir que el flujo del proceso se desvíe por una u otra rama saliente del gateway XOR, vamos a utilizar tablas de decisión.
Si seleccionas el flujo básico y lo defines como "flujo por defecto", aquí no tendremos que hacer nada más.
Ahora selecciona el flujo normal. Verás que tenemos 2 opciones para establecer condiciones. La nuestra será "Utilizar la tabla de decisión".
Recuerda que queremos establecer condiciones de acuerdo a la tabla del enunciado del problema.
Básicamente, queremos que se asigne el perfil "normal" a aquellos que cumplen que
(vnContratante.edad>18 && vnContratante.edad <= 40 && vnContratante.ingresos == 1) ||
(vnContratante.edad>40 && vnContratante.edad <= 60 && vnContratante.ingresos == 0) ||
(vnContratante.edad>60 && vnContratante.ingresos == 1)
Vamos a hacer eso, poner asociar todas esas condiciones al flujo.
El flujo básico no hace falta editarlo puesto que lo hemos definido como flujo por defecto.
Selecciona el flujo etiquetado como normal, y edita la tabla de decisión.
Cada conjunto de condiciones AND (&&) estará en una fila distinta. Añadimos línea.
Agregamos condición.
Editamos la condición.
Escribimos la primera comparación
vnContratante.getEdad()>18
y añadimos otra condición.
Editamos esa nueva condición:
vnContratante.getEdad() <= 40
Para añadir otra condición:
Que editamos de la misma forma, pero con la siguiente expresión:
vnContratante.getIngresos() == 1
Y terminamos actualizando la fila.
Ten en cuenta que lo mismo podríamos haber conseguido en una única condición —un único script— utilizando el operador lógico &&:
vnContratante.getEdad()>18 && vnContratante.getEdad() <= 40 && vnContratante.getIngresos() == 1
Incluso podemos no utilizar los métodos de la clase de objetos y acceder directamente a los atributos:
vnContratante.edad()>18 && vnContratante.edad() <= 40 && vnContratante.ingresos() == 1
Digamos que el método mostrado anteriormente, aunque más trabajoso, posiblemente evita errores de parentizado y conexión lógica, aunque un programador, sin ser experto, preferirá escribir la expresión completa en un solo paso.
Todas esas comparaciones están conectadas con &&, deben cumplirse todas esas condiciones o todas las que vamos a añadir ahora de la misma manera.
Añadimos una nueva línea y agregamos condiciones.
Definimos las nuevas condiciones
vnContratante.getEdad() > 40
vnContratante.getEdad() <= 60
vnContratante.getIngresos() == 0
Actualizamos fila y añadimos otra línea con las condiciones
vnContratante.getEdad() > 60
vnContratante.getIngresos() == 1
Al final, tendremos algo como esto. Ya podemos "Finalizar".
Con esto hemos terminado de configurar el flujo normal. Comprueba que puedes ver esas condiciones:
Para el flujo premium es algo parecido. Las condiciones a cumplir se pueden resumir en
(laedad > 18 && losingresos==2) ||
(laedad > 40 && laedad <=60 && losingresos == 1)
Te hemos descrito el interfaz de definición de tablas de decisión desde su operativa más básica, pero también más trabajosa. En realidad, se puede hacer todo una única expresión:
Cambia el método de evaluación a "use la expresión".
Asóciale un script Java con todas las condiciones conectadas adecuadamente con AND (&&) y OR (||), cuidando los paréntesis.
(vnContratante.edad>18 && vnContratante.edad <= 40 && vnContratante.ingresos == 1) ||
(vnContratante.edad>40 && vnContratante.edad <= 60 && vnContratante.ingresos == 0) ||
(vnContratante.edad>60 && vnContratante.ingresos == 1)
Esto es solo un ejemplo, las tablas de decisión en Bonita son un método de introducir condiciones dirigido a quienes pueda tener dificultades en construir correctamente expresiones complejas. El uso de tablas de decisión también está justificado cuando hay muchas variables y condiciones a evaluar que, al usar este método, podremos controlar y verificar más fácilmente.
Otro detalle adicional que hace recomendable el método del asistente es que podemos ordenar esas condiciones, ordenando las líneas de las tablas de decisión. Además, independientemente de si es por tabla de decisión o por expresiones, la prioridad de flujos en la compuerta también puede definirse según nuestros deseos.
Vamos a intentar ahorrar trabajo, mucho vendrá dado por aprovechar lo que vayamos haciendo.
Queremos conseguir lo siguiente:
Fíjate que todos son cambios cosméticos, nada más. Para eso, para aprovechar trabajo ya hecho, guarda el formulario. Y ahora vuelve a "guardar como" fNormal; y vuelve a "guardar como" fPremium. Tienes 3 copias del mismo formulario, cada una de ellos lo modificarás para que se adecúe a la tarea a la que se asigne.
Recuerda volver a asignar el formulario correcto a la tarea ofrecer básico, si es que hubiera cambiado.
Tan solo debes definir el contrato de estas tareas de la misma forma que antes y seleccionar el formulario adecuado de los que acabas de guardar. Sí tienes que hacer algunos cambios cosméticos para que se note que son formularios diferentes.
También puedes copiar y pegar la tarea ofrecer básico, colocarla en el sitio adecuado, renombrarla y elegir el formulario correcto.
Para ofrecer normal:
Y para ofrecer premium:
Ejecuta el proceso e instancia con estos valores:
Toma la tarea pendiente y complétala.
Comprueba que se han almacenado los valores correctos.
¿Era lo que esperábamos? Prueba a ejecutar de nuevo con otros valores.