Lo interesante de un proceso como este es verificar los resultados de la iteración. Piénsese que es, en el fondo, una votación. Lo lógico es establecer una mayoría para la autorización o una condición para el rechazo.
Recordemos que se trata de una solicitud de compra que precisa el visto de 3 supervisores. En nuestro caso, planteamos que la compra se autoriza si al menos 2 supervisores dan su visto bueno, esto es, si hay una mayoría de votos positivos.
Para eso añadimos una tarea posterior a la votación encargada del recuento.
Evidentemente, los primeros pasos son iguales que en el proceso anterior (versión 0.9), pero lo que nos interesa ahora es el resultado que obtenemos con la última tarea de script. Esta tarea cuenta los votos y, si hay mayoría de vistos buenos, marca la solicitud como aprobada (aprobado==true). Es el caso que vemos aquí, donde la solicitud ha sido aprobada por 2 votos a favor y 1 en contra.
Duplicamos el diagrama y aumentamos las versiones a 1.0.
A continuación, añadimos la tarea de script como se ve en el diagrama del inicio de esta página.
En la versión anterior, simplemente generamos 3 instancias de la tarea aprobar a partir de la lista de supervisores —los usuarios identificados con 5L, 6L, y 7L—, pero no guardábamos ningún resultado, ningún voto. Para eso, necesitamos alguna variable que nos permita el recuento. Esto lo hacemos desde el diálogo "iteración" de la tarea.
Al marcar "almacenar los resultados" se nos habilitan los controles
"Datos del resultado en cada instancia"
Cada instancia es un voto. En esta variable se almacenará el voto de cada instancia de "aprobar". Podemos pensar que, puesto que estamos creando 3 instancias, tendremos 3 variables, cada uno con un voto particular.
"Lista de resultados anexados"
Cada vez que una de esas variables adquiere valor —en nuestro caso, verdadero o falso— se añade a la "lista de votos". Este es la variable que utilizaremos realmente en el recuento.
En resumen, necesitamos un espacio para que cada instancia informe de su resultado, y esos valores se irán enlistando en una variable resultado final.
Para la variable de cada instancia, simplemente abrimos el desplegable y "creamos una variable nueva" de tipo BOOLEAN y de nombre "aprueba".
Hacemos lo mismo con la lista de resultados, creamos la variable con nombre "aprobados", también de tipo BOOLEAN —va a almacenar todos los "aprueba"— y, si nos fijamos, veremos que la casilla "múltiple" está marcada. Es la forma de decirle a Bonita que es una "lista de booleanos".
Respecto de esta última variable "aprobados", en nuestro ejemplo hemos elegido "crear una variable" y no "crear un Dato de negocio", que es la otra opción que nos permite el diálogo.
Si nos vamos un momento a la pestaña "Datos" veremos que estás acciones, efectivamente, han creado 2 variables nuevas, "aprobados" como variable de proceso, y aprueba como variable local. Lo importante es entender el alcance de estas variables: las variables de proceso son accesibles durante toda la ejecución del proceso; las variables locales a una tarea, solo existen mientras la tarea se está ejecutando. Por eso decimos que "aprueba" se crea y se destruye 3 veces en nuestro ejemplo. Recordemos, también, que ninguna de estas variables persiste al acabar el proceso, solo las variables de negocio se almacenan en base de datos.
Antes hemos hecho un contrato para la tarea "aprobar". El sistema, además genera un formulario basado en ese contrato cada vez que ejecutamos. Recordemos que, aunque se ejecutará 3 veces, es una tarea normal en ese sentido, necesita esos contrato, formulario... y operaciones, el resultado del formulario debemos almacenarlo de alguna forma.
Aquí es donde entra en juego esa variable que hemos creado en la pestaña iteración, la variable local "aprueba".
Recordemos que el contrato contiene una variable booleana, es decir, el contrato solo mostrará un input para asignarle true o false. Se devuelve ese valor de verdad en esa entrada de contrato y, si lo queremos utilizar, tenemos que almacenarlo en una variable del proceso.
Por eso, añadimos una operación a la tarea aprobar. Solo tenemos que escoger la variable en el selector de la izquierda y la entrada de contrato en el de la derecha.
NOTA: no estamos utilizando variables de negocio en el contrato sino variables de proceso —"añadir" en vez de "añadir desde datos"—, por eso no se generan operaciones automáticamente.
Se podría haber compactado en una única operación pero, en aras de la claridad, hemos preferido hacerlo en tres pasos. Recordemos que tenemos 3 atributos en la variable de negocio (vncompra) relacionados con el recuento de votos: votos a favor (vncompra.aFavor), en contra (vncompra.aEncontra) y resultado de la votación (vncompra.aprobado). En todos los casos se usa el método Java apropiado.
Y en todos los casos se trata de un script Groovy sencillo que nos hace el cálculo requerido.
cuentaAfavor()
aprobados.count(true)
cuentaEncontra()
aprobados.count(false)
aprobadoOno()
aprobados.count(true)>aprobados.size()/2
Ahora es cuando utilizamos la variable de proceso "aprobados" la lista que almacena todos los votos emitidos. Simplemente recorremos la lista y contamos los votos de uno y otro signo. En el último script, devolvemos si hay mayoría o no.
Con lo que hemos configurado ya podemos ejecutar el proceso y observar los resultados. Sin embargo, antes de eso, vamos a generar formularios para la instanciación del proceso y para la tarea aprobar. Eso hará un poco más amigables los formularios.
En el de instanciación hemos hecho algunos cambios cosméticos en los títulos, y en el de la tarea "aprobar", hemos alineado el botón de enviar a la izquierda.
Al de instanciación lo hemos llamado fComprar y al de la tarea fAprobar.
Comprueba que la solicitud se aprueba o deniega en función del recuento de votos.
Mejora: accede al siguiente ejercicio