Esta es una recopilación de cosas útiles que se han ido viendo durante los ejemplos, pero que no son del todo fáciles de encontrar.
import java.time.LocalDateTime;
????.fecha = LocalDateTime.now();
El tipo concreto de fecha (java.time.*) depende de lo elegido para el atributo de la variable de negocio o la variable de proceso. Por ejemplo:
import java.time.LocalDate;
????.fecha = LocalDate.now();
Este código se puede obtener de "plantillas de código" (processInitiatorUser) al escribir un script en Bonita
def processInitiator = apiAccessor.getIdentityAPI().getUser(apiAccessor.getProcessAPI()
.getProcessInstance(processInstanceId)
.getStartedBy())
Con esto obtenemos el identificador del usuario que ha iniciado el proceso —Walter Bates en nuestro entorno de desarrollo—. Con él podemos acceder a su información personal, por ejemplo:
???? = processInitiator.firstName+" "+processInitiator.lastName
Quién es el usuario que está ejecutando el formulario
../API/system/session/1
Con esta expresión tenemos acceso, entre otros, a .user_id y .user_name. (doc)
../API/identity/user/{{idusuario}}
Ese idusuario se obtiene bien de la variable definida con la API externa anterior, bien porque se dispone previamente de él —una variable de negocio, por ejemplo—. Si suponemos que tenemos una variable de formulario usuario, la expresión sería
../API/identity/user/{{usuario.user_id}}
Nos proporciona, entre otros, .firstname y .lastname. (doc)
Dependiendo de cómo esté diseñado nuestro proceso, en algunas tareas no tendremos acceso directo a las variables de negocio en el formulario. Si queremos recuperarlas para mostrar algunos datos para ofrecer una información más completa, necesitamos una variable —la hemos llamado misdatos pero tú pondrás el nombre que quieras—:
nombre: misdatos
tipo: External API
API URL: ../{{context.mivn_ref.link}}
Se supone que mivn es el nombre de la variable de negocio a la que queremos acceder.
Parecido al anterior, pero nos permite recuperar las variables de proceso. (doc)
nombre: misdatos
tipo: EXTERNAL API
valor: ../API/bpm/caseVariable/{{task.caseId}}/mivariable
Se supone que mivariable es el nombre de la variable de proceso a la que queremos acceder. Nos devolverá un JSON con estas propiedades:
{
"description":"Detailed description of the case variable, as set in the definition at design-time",
"name":"name of the variable in the case",
"value":"the current value of the case variable",
"case_id":"ID of the case this variable belongs to",
"type":_the Java type of the variable"
}
Por lo que, si solo queremos el valor, deberemos acceder a misdatos.value.
Se supone que tenemos definida una variable de proceso mivariable, y que el formulario dispone, además, de las variables
nombre: taskId
tipo: URL
valor: id
y
nombre: task
tipo: EXTERNAL API
valor: ../API/bpm/userTask/{{taskId}}
Por lo tanto, estamos en un formulario de una tarea y, por lo general, esas dos últimas variables ya nos las pone Bonita. La variable task la necesitamos porque nos informa del identificador de caso.
Muy parecido al anterior, igualmente tenemos acceso a las variables de proceso —no a las de negocio— y a las variables locales de una tarea.
../API/bpm/activityVariable/{{taskId}}/nombreVariable
Podemos consultar cualquier modelo de datos de negocio desplegado (doc), por ejemplo:
tipo: EXTERNAL API
valor: ../API/bdm/businessData/unBDM?q=find&p=0&c=100
Donde unBDM será algo parecido a com.company.model.mibdm.
Los widget select son listas deplegables que muestran texto y asignan un valor. Por lo general, estarán asociados a listas generadas desde Bonita, una consulta de base de datos, por ejemplo, pero puede que necesitemos crear una por nuestra cuenta para elegir desde una lista de opciones propias.
Supongamos que esa lista es [1, 2, 3] pero que, para que sea más entendible, queremos asociar cada valor con un texto descriptivo. Sea, entonces, [{"primera opción":1}, {"segunda opción":2}, {"tercera opción":3}].
El resultado que queremos obtener es el que te mostramos en la imagen, y queremos que devuelva el valor asociado cada ítem de la lista.
Y el formulario devolverá el valor asociado a esa opción.
En primer lugar necesitas una variable de formulario de tipo JSON, supongamos que la llamamos vLista, y con el siguiente contenido:
[
{"etiq":"primera opción", "valor":1},
{"etiq":"segunda opción", "valor":2},
{"etiq":"tercera opción", "valor":3}
]
Habitualmente, con datos escalares, UI Designer nos generará un widget input a partir de la entrada de contrato. Deberemos transformarlo a un widget select.
La configuración del widget nos pide:
la fuente de datos (valores disponibles): vLista, elegimos la variable anterior con la lista desplegable, y debe quedar enlazada
el texto a mostrar (clave mostrada): etiq, lo escribimos directamente, y no debe estar enlazado (fx, a la derecha, debe estar visible)
el valor asociado a ese texto (clave de retorno): valor, igual que el anterior, escrito directamente sin enlazar.
Hay otro dato importante, pero que no deberíamos necesitar modificar: valor. Cuando elijamos una etiq de la lista, el widget depositará aquí el valor asociado, y será lo que devuelva el formulario. Esto vendrá preconfigurado si hemos definido bien el contrato.
El resumen es que un widget de este tipo se nutre de un JSON en el que especificamos una lista de pares (clave mostrada, clave de retorno) del tipo que queramos, texto o número.
La clave mostrada no es imprescindible, pero sí la de retorno. Nuestro JSON podría ser solo una lista de (clave retorno), y la utilizaríamos tanto para lo mostrado como lo retornado.
En ocasiones, el formulario no define automáticamente la variable formInput. Utilizamos esta variable para enlazar la elección que hagamos y poder devolverla a una entrada de contrato.
Supongamos que así ocurre; si trabajamos con la variable de negocio, lo normal es que nos aparezca algo así en el panel de variables del formulario:
vn ../{{context.vn_ref.link}} External API
Donde vn es el nombre que le hemos dado a la variable de negocio, y que mantiene un atributo aprobado de tipo boolean.
Entonces, en valor seleccionado solo tenemos que poner:
vn.aprobado
Estamos suponiendo que hemos definido una variable JSON aprobar con el siguiente contenido:
[ {"q":"aprobar", "v":true},{"q":"rechazar", "v":false} ]
Por otro lado, en las operaciones definidas por Bonita para satisfacer el contrato, no tendremos que modificar nada, pero nos aparecerá la siguiente configuración:
vn --> setAprobado --> vnInput.aprobado
Donde el último valor es un script Java con la expresión:
vnInput?.aprobado
Un caso especial de uso de los radio buttons son los atributos de tipo boolean.
Si tuviéramos una variable de negocio vn con un atributo aprobada de tipo boolean, la generación automática de formularios de Bonita nos los mostraría con un checkbox que marcaremos o no.
Queda mucho más explícito si convertimos ese widget a uno de tipo radio button.
Necesitamos una variable JSON
[ {"l":"aprobar", "v":true}, {"l":"rechazar", "v":false} ]
Y enlazar esta variable al widget.
Para hacer el ejemplo anterior debemos cambiar un checkbox por un radio button. Podríamos borrar widget original y crear el nuevo, pero una forma de no perder toda la configuración asociada al widget es transformarlo. Esto se hace colocando el curso encima del widget y pulsando en el icono central que nos aparece como menú de contexto.
A continuación nos muestra un diálogo en el que podemos desplegar la lista de widgets disponibles y elegir el nuestro.
El botón "cambiar" está desactivado. Para activarlo, y pulsarlo, debemos pulsar primero "mostrar propiedades", aunque no vayamos a modificar nada.