BPM - Gestión de procesos

:mantelpiece_clock: 45 min

Alcance

La Gestión de procesos sirve para automatizar tareas, estandarizar circuitos, mantener los flujos de trabajo bajo control.

Mediante este núcleo funcional es posible diseñar un proceso BPM mediante diagramas, agregar scripts para las tareas automáticas, definir los equipos que podrán ver, utilizar el proceso y hacer la gestión del proceso.

Para gestionar el proceso el usuario tiene distintas posibilidades: la operación Gestión de Procesos (carga de casos) y los paneles (Tablero de equipos y la Bandeja de equipos).

Estas herramientas permiten extender las posibilidades del ERP en la representación de procesos de negocio.

El proceso sé diagrama en la notación BPMN que es un estándar mundial en la representación de procesos. La edición del proceso se realiza gráficamente.

El proceso puede estar compuesto por tareas manuales o tareas automáticas que el sistema ejecuta en función de parámetros del caso y/o información de la base de datos.

Las tareas automáticas se describen mediante un script en java, para definirlo hay un asistente con plantillas y funciones que permiten hacer numerosas configuraciones con pocas nociones de programación.

Los diagramas de los procesos se guardan como un XML que puede ser utilizado como plantilla para crear nuevos procesos.

Los procesos se relacionan con los workflows del ERP de distintas formas: una transacción del ERP puede crear una instancia de un proceso (caso), desde un caso se puede crear una transacción ERP o se puede alinear una etapa de un workflow con una actividad del proceso de modo tal que cuando se ejecuta la transacción ERP se ejecuta automáticamente la actividad del proceso.

Una vez que el proceso está definido, los usuarios que son responsables de cada actividad ven los casos en su bandeja de equipos desde la cual lo pueden gestionar. Desde la bandeja de equipos se puede hacer el seguimiento de todas las instancias abiertas del proceso.

Entrando en un caso se puede ver la evolución del mismo desde su creación hasta el estado actual.

Lista de transacciones y maestros

Transacciones

  • Gestión de casos
  • Carga de horas reales

Informes

  • Actividades realizadas

Tableros

  • Tablero de Equipos
  • Bandeja de Equipos

Maestros principales

  • Procesos
  • Equipos
  • Usuarios

Diseño y gestión de procesos

Mediante una serie de ejemplos se describe la metodología para diseñar y ejecutar los procesos.

Proceso con tareas manuales

Se define un proceso de trámite que solo contiene 3 tareas manuales, un evento de inicio y un evento de finalización.

Para diseñar el proceso se accede desde Menú → AppBuilder → Diccionarios → Procesos

Se ingresa el código, nombre, el tipo “Caso Directo” y se guarda.

Los tipos de procesos posibles son:

Caso Directo Caso genérico
Transacción ERP Cuando el caso es creado por una transacción del ERP
Oportunidad Comercial Cuando se trata de un caso de CRM

Se oprime el botón Diagramar:

|602x51.99999999999999

|349.99999999999994x220

Se arrastra el evento de inicio y se le asigna un nombre:

Luego se arrastra el icono de tarea (rectángulo celeste), al moverlo sobre una actividad existente del diagrama (como el evento de inicio) aparece la tarea en línea punteada, al soltar el botón del mouse la tarea queda vinculada a la actividad.

De esta forma se van agregando el resto de actividades: eventos, tareas, compuertas.

|546x295.99999999999994

La última actividad es el evento de “Fin”. (Se le debe colocar un nombre, ej. Fin).

Cuando el diagrama está terminado se oprime la opción del menú Archivo /Actualizar proceso.

Al ejecutar esta orden el proceso queda guardado y se cierra la ventana del Diagrama automáticamente.

|551x246.99999999999997

Se pueden apreciar en la solapa BPM el listado de actividades establecidas en el diagrama.

Para terminar de definir el proceso se debe completar la solapa equipos y la solapa Informe de alerta y errores.

Se agregan los Equipos que van a poder interactuar con el proceso.

Las posibilidades de interacción son:
“Ven todos”: Todos los miembros del equipo pueden ver el caso.

“Ver responsable”: Solo puede ver el caso el miembro del equipo que es responsable del caso.

“Checkbox → Modificar”: Habilita la edición y ejecución de las actividades del caso.

En la solapa Informe de Alertas y Errores se ingresan los usuarios que se les va a informar vía mail si hay algún error durante la ejecución del proceso.

|548x226.99999999999997

La selección de los equipos y responsables de cada actividad se pueden configurar de tres maneras, ingresando en la sección de Equipo y Responsable dentro de la configuración de la actividad correspondiente:

  • Hereda de la actividad anterior.
  • Se define en el caso.
  • Se define en la actividad.

En el ejemplo lo definimos en la actividad:

Más adelante se explica en detalle esta configuración. Equipo y responsables

Ejecución de un proceso

Se denomina caso o instancia del proceso, a cada ocasión en la que se ejecuta un proceso.

Para crear un caso se accede desde Menú → WS → Procesos → Gestión de Casos

Se oprime nuevo y se selecciona el proceso correspondiente. Se completan los datos del encabezado. Luego de guardar el caso la actividad a realizar es Asignar Trámite.

|423x252.00000000000003

Para ejecutar la acción, el Responsable debe presionar el botón PLAY lo cual por consiguiente se abre una ventana con dos solapas, y dependiendo de la configuración elegida respecto a la selección de equipo y responsable en la actividad dentro del diagrama, debe completarle o no los mismos en la solapa Próximas Actividades correspondiente a la próxima tarea Ejecutar Trámite.

En la grilla de casos aparecen los casos de “Trámite”.

El responsable de la tarea realiza la etapa del trabajo que corresponde. Abre el caso e indica la ejecución en el sistema. La próxima tarea es informar el resultado. Actividad que puede realizar enviando un mail, una notificación o dejando un comentario en el caso.

Luego confirma la acción y el caso queda finalizado.

|493.0000000000001x164

Tildando el botón Historial de la toolbar se puede ver el seguimiento del caso desde que se inicia hasta que se finaliza.

Panel de equipo

El panel de equipo es otra alternativa para gestionar procesos. Se Accede desde Menú → WS → Procesos → Tablero de equipos.

Se selecciona un equipo en los parámetros y se oprime aceptar. El tablero muestra una serie de gráficos que permiten visualizar el estado general de los casos: según actividad a realizar, por responsables, por prioridad.

|585x392.99999999999994

En la grilla inferior se visualiza el detalle de los casos pendientes. Haciendo clic en el título del caso se accede al mismo para editarlo o ejecutar una actividad.

|601.9999999999999x91.00000000000001

Bandeja de equipos

La bandeja de equipos es otro acceso a los casos, que permite relacionarlos con los mails de una cuenta que esté vinculada al equipo.

Se puede filtrar por equipo, organización, fecha, entre otros; visualizados en la sección de filtros, luego de completar los mismos, se actualiza. En la primera área de la pantalla se observan los mails que se recibieron pertenecientes a la cuenta común al equipo. En el área inferior se encuentran los casos. Para vincular un mail a un caso se selecciona el mail, el caso y luego se oprime el botón Asociar a un caso.

Desde la bandeja también se puede crear un caso a partir de un mail, crear contactos y publicar un mail.

Procesos con tareas automáticas (scripts)

Los scripts son programas que se escriben en ciertas actividades (tareas) o compuertas para definir acciones que el sistema debe ejecutar automáticamente: desviar el flujo de acuerdo a un valor determinado, ejecutar un store procedure, enviar mails, etc.

Proceso con compuertas

Se va a hacer una representación mediante un proceso que está formado por una serie de tareas manuales: Planificar caso, Ejecutar Caso y Certificar caso y una compuerta donde se redirecciona el caso dependiendo de la evaluación (certificación). Si se evalúa como correcto termina el caso y si no fue aprobado se envía nuevamente a la actividad Ejecutar Caso.

Primero se realiza el dibujo del proceso como se indica en el diagrama. Al terminar se oprime Archivo/Actualizar proceso. Posteriormente, se realiza la edición de la actividad Certificar Caso para agregarle las opciones que va a ver el usuario mediante un XML y luego se va a editar la compuerta Aprobado? Para agregar el script que redirecciona el caso de acuerdo a la elección que hizo el usuario en Certificar Caso.

Para realizar la edición de la compuerta, se hace clic derecho en la misma, se observa en el apartado Editar Configuración, la sección script en la cual se oprime el botón Editar.

Se abre una ventana donde el usuario puede ingresar y editar el script. Al final de la ventana se encuentra el botón Incorporar funciones, el cual despliega un listado de funciones que contienen el código de los scripts más usuales.

|578x338.00000000000006

Para este ejemplo se va a introducir el siguiente código en el script:

import app.bsuite.transacciones.operacion.OperacionHLP;

import app.bsuite.transacciones.operacion.model.OperacionVO;

String sessionID = params.getSessionID();

DBHelper dbh = params.getDBHelper();

CasoBPMAccionVO accion = params.get("Accion");

BPMServiceHLP bpm = new BPMServiceHLP(sessionID, dbh); /* Soporte operar con BPM */

UtilsHLP utils = new UtilsHLP(sessionID); /* Soporte para operar con funciones básicas */

Integer estado = new Integer(0);

if(!utils.isEmpty(accion.getAtributo("Evaluacion").getValor())) {

estado = new Integer(accion.getAtributo("Evaluacion").getValor());

}

else {

//accion.setCancelada();

}

if( Integer.valueOf(2).equals(estado) ) {

bpm.bifurcarHacia(accion, "Ejecutar Caso");

accion.getAtributo("Evaluacion").setValor(0);

}

else {

bpm.bifurcarHacia(accion, "Fin");

}

Luego se configura la tarea Certificar Caso, para que cuando se ejecuta esa tarea, aparezca un campo donde el usuario pueda seleccionar si el caso está Aprobado o Rechazado.

Para esto se debe hacer clic derecho sobre la actividad Certificar Caso, y seleccionar la opción de Editar Configuración. Al ingresar, en la sección XML se oprime el botón Editar.

|478.9999999999999x232

En la ventana se escribe el siguiente código XML:

<?xml version="1.0" encoding="UTF-8"?>

<form type="convert">

<layout>

<widget type="WidgetComboBox" id="Evaluacion" caption="Evaluacion" after="Titulo" serverAttribute="Evaluacion" >

<option value="1" caption="Aprobado"/>

<option value="2" caption="Rechazado"/>

</widget>

</layout>

</form>

Allí se indican los campos que va a completar el usuario, los valores posibles a seleccionar, el nombre de los campos adicionales donde la información se va a guardar posteriormente en la tabla de casos, la ubicación donde van a aparecer los campos. Para finalizar se guarda el proceso en Archivo/Actualizar caso.

|161.4322899510814x122.30769230769229

Proceso de consulta de datos y envío de mails

Este proceso de Control de stock utiliza un evento de tipo temporizador.

Para dibujar este componente se arrastra al diagrama el ícono de evento (círculo con doble línea naranja).

Luego se oprime el botón derecho y se oprime Seleccionar Tipo de evento/Temporizador.

Al editar la actividad Controlar Stock (haciendo clic derecho desde el diagrama y eligiendo Editar Configuración) encontramos una segunda solapa donde se puede definir la frecuencia en que se ejecuta el evento.

Un script modelo para esta actividad sería:

import faf.app.base.data.dataset.DatasetUtil;

import faf.app.base.data.dataset.model.FafDataSetVO;

String sessionID = params.getSessionID();

DBHelper dbh = params.getDBHelper();

CasoBPMAccionVO accion = params.get("Accion");

CasoScriptResultado result = new CasoScriptResultado();

Integer TIPO_STOCK_AMBOS = Integer.valueOf(0);

Integer TIPO_PRODUCTO_TODOS = Integer.valueOf(0);

String dataXMLEntrada = accion.getDataXML();

String dataXMLSalida = "";

UtilsHLP utils = new UtilsHLP(sessionID);

StockHLP stock = new StockHLP(sessionID, dbh);

String retorna = "";

Vector tipos = new Vector();

tipos.add(java.sql.Date.class);

tipos.add(Long.class);

tipos.add(Long.class);

tipos.add(Long.class);

tipos.add(Long.class);

tipos.add(Long.class);

tipos.add(Long.class);

tipos.add(Integer.class);

tipos.add(Long.class);

tipos.add(Boolean.class);

tipos.add(Boolean.class);

tipos.add(Integer.class);

tipos.add(Integer.class);

tipos.add(Long.class);

tipos.add(Integer.class);

tipos.add(Integer.class);

tipos.add(Integer.class);

Long productoReportCode = FafDataSetVO.getReportCodeForID(sessionID , 0, "Producto", dbh);

Long lugarReportCode = FafDataSetVO.getReportCodeForID(sessionID , Long.valueOf(0), "Lugar", dbh);

Long depositoReportCode = FafDataSetVO.getReportCodeForID(sessionID , 0, "Deposito", dbh);

Long subdepReportCode = FafDataSetVO.getReportCodeForID(sessionID , Long.valueOf(0), "Subdeposito", dbh);

Long organizacionReportCode = FafDataSetVO.getReportCodeForID(sessionID , 0, "Organizacion", dbh);

Long circuitoReportCode = FafDataSetVO.getReportCodeForID(sessionID , Long.valueOf(0), "CircuitoContable", dbh);

Long empresaReportCode = FafDataSetVO.getReportCodeForID(sessionID , 0, "PARAMEmpresa", dbh);

Vector valores = new Vector();

valores.add(utils.getCurrentDate());

valores.add(productoReportCode);

valores.add(lugarReportCode);

valores.add(depositoReportCode);

valores.add(subdepReportCode);

valores.add(organizacionReportCode);

valores.add(null);

valores.add(TIPO_STOCK_AMBOS);

valores.add(circuitoReportCode);

valores.add(new Boolean(false));

valores.add(new Boolean(true));

valores.add(Integer.valueOf(0));

valores.add(TIPO_PRODUCTO_TODOS);

valores.add(empresaReportCode);

valores.add(Integer.valueOf(0));

valores.add(Integer.valueOf(0));

valores.add(Integer.valueOf(1));

fafrs = DatasetUtil.runSP(dbh, sessionID, "P_BS_ST_0030", tipos, valores);

ResultSet rs = fafrs.getResultSet();

String depositoNombre = "";

String productos = "";

while (rs.next()) {

if(!depositoNombre.equals(FafString.valString(rs.getString("Deposito"))) && !utils.isEmpty(productos)) {

retorna += "<deposito>\n" +

"<nombre>" + FafString.valString(depositoNombre) + "</nombre>\n" +

"<productos>\n" +

productos +

"</productos>\n" +

"</deposito>\n";

productos = "";

depositoNombre = FafString.valString(rs.getString("Deposito"));

}

BigDecimal cantidadReponer = FafDecimal.val(rs.getString("CantidadStockaReponer"));

if(!utils.isEmpty(cantidadReponer))

productos += "<producto>\n" +

"<nombre>" + FafString.valString(rs.getString("Producto")) + "</nombre>\n" +

"<cantidad1>" + FafString.valString(rs.getString("Cantidad1")) + "</cantidad1>\n" +

"<unidad1>" + FafString.valString(rs.getString("Unidad1")) + "</unidad1>\n" +

"<cantidad2>" + FafString.valString(rs.getString("Cantidad2")) + "</cantidad2>\n" +

"<unidad2>" + FafString.valString(rs.getString("Unidad2")) + "</unidad2>\n" +

"<cantidadreponer>" + cantidadReponer + "</cantidadreponer>\n" +

"</producto>\n";

}

if(!utils.isEmpty(productos))

retorna += "<deposito>\n" +

"<nombre>" + FafString.valString(depositoNombre) + "</nombre>\n" +

"<productos>\n" +

productos +

"</productos>\n" +

"</deposito>\n";

if(!utils.isEmpty(retorna))

retorna = "<root>\n" +

"<depositos>\n" +

retorna +

"</depositos>\n" +

"</root>\n";

dataXMLSalida = retorna;

result.setDataXML(dataXMLSalida);

Proceso con tareas paralelas

Existen otros tipos de compuertas llamadas compuertas paralelas. Para definir el tipo de las mismas se debe hacer clic derecho sobre la compuerta dentro del diagrama: Seleccionar Tipo de Compuerta/Compuerta Paralela. Este tipo de compuertas permite bifurcar el proceso en más de una rama. Para que la compuerta paralela se cierre, va a necesitar un script particular que va a pedir que todas las actividades de las distintas ramas se completen.

El gráfico denota dos actividades que deben ejecutarse en paralelo, finalizarse y así poder continuar a la tarea que le sucede (en el ejemplo, la tarea Dar Presentación).

El proceso se compone de tareas manuales que requieren mínimas configuraciones, además son de sencilla ejecución, y dos compuertas paralelas. Solo la última de estas dos va a requerir un script que permitirá pasar a las actividades siguientes una vez finalizadas las actividades de las dos ramas entre compuertas.

Un modelo de script para esa compuerta sería:

String sessionID = params.getSessionID();

DBHelper dbh = params.getDBHelper();

CasoVO caso = params.get("Caso");

CasoBPMAccionVO accion = params.get("Accion");

BPMServiceHLP bpm = new BPMServiceHLP(sessionID, dbh); /* Soporte operar con BPM */

bpm.accionarSoloSiTodas(accion);

Responsables de ejecutar las actividades

El proceso tiene definido (en el apartado Equipos) los equipos que se van a poder ver o editar el proceso.

Por otro lado, se va a tener que indicar el responsable de ejecutar cada actividad. Aquí existen distintas posibilidades y reglas que se van a analizar a continuación.

Los equipos o los responsables pueden ser definidos en el proceso o quedar editables para que el usuario los complete. Al configurar cada actividad se indican estos comportamientos en los campos Equipo Modo y Responsable Modo.

|409.99999999999994x388

Equipo

  • Modo → Se define en la actividad: esto significa que el equipo estará definido en el proceso. Cuando se selecciona esta opción se habilita un campo para dejar un equipo seleccionado.
    Cuando el usuario ejecute esta actividad el campo Equipo ya estará completo y no se podrá editar.
  • Modo → Se define en el caso: en el proceso no se define el equipo y el campo está editable cuando el usuario ejecuta la actividad. El usuario deberá definirlo obligatoriamente, ya que no puede haber actividades sin equipo asignado.
  • Modo → Hereda de la actividad anterior: El equipo se toma de la actividad anterior. Las actividades que se ejecutan automáticamente: Compuertas, Eventos, Tareas de tipo Script usan este modo.
  • CheckBox → Edita: Si está tildado significa que el usuario tendrá un equipo definido cuando ejecuta el proceso, pero podrá editarlo y asignar el caso a otro equipo. Si, por el contrario, no está tildado, el equipo ya estará definido y el usuario no podrá modificarlo.

Responsable

Se indica qué miembro va a ser responsable de la actividad. Los modos funcionan de la misma manera que para el equipo con la salvedad de que las actividades pueden o no requerir un responsable. Si el campo Obliga no está tildado, el responsable no va a ser requerido mientras que si está tildado va a ser obligatorio.

Casos derivados

La funcionalidad Derivar Caso le permite al usuario generar un seguimiento adicional a un caso (desde el cual se genera la derivación) involucrando otros procesos. Se trata de establecer un caso padre que se relaciona con varios casos hijos que pueden pertenecer a distintos procesos. Cabe aclarar que estos casos tanto padres como hijos funcionan de manera independiente; esto quiere decir que se pueden ejecutar y finalizar sin que los derivados lo hagan.

Para derivar un caso a partir de otro, basta con que el usuario genere un caso (el que va a ser el caso o proceso padre), lo guarde, y presione el botón Derivar contemplado en la toolbar:

El cual abre un selector con el listado de procesos y se selecciona el proceso correspondiente al caso hijo que se va a crear.

|541x335.99999999999994

Al accionar el botón derivar, el usuario podrá visualizar una nueva ventana donde podrá generar casos hijos, relacionados con el caso padre. De esta forma es posible concentrar una cantidad de casos en uno principal para facilitar su seguimiento.

El caso derivado, al igual que cualquier otro, requerirá las configuraciones o el ingreso de datos pertinentes, pero puede verse como la organización y el título se heredan.

Dentro de la grilla donde se muestran los casos generados o derivados, en el campo Caso Derivado se denota el origen, es decir, el caso padre del cual dicho caso proviene o fue generado.

Por último dentro del caso Padre, va a estar disponible una pestaña de Transacciones Asociadas que va a mostrar y permitir el acceso a los casos hijos, como así también a documento externos al proceso (transacciones por ejemplo).

Procesos relacionados con workflows

Relacionando los procesos con los workflows, se extienden de una forma muy versátil las funcionalidades del ERP.

Transacciones que crean y actualizan casos

Por medio de este ejemplo se ilustrarán estas dos funcionalidades.

Se puede ver un proceso que se inicia a partir de la carga de una Orden de Compra. La misma acorde al valor de la transacción, pasa por controles gerenciales de autorización de la misma. Una vez firmada la orden se da lugar a la notificación de el/los proveedor/es para luego, mediante la carga de una Recepción, finalizar el proceso. Cabe aclarar que si los controles gerenciales no aprueban la efectivización de la Orden de Compra el proceso finaliza.

La generación de la Recepción actualiza el estado del proceso, ya que para dar lugar a la finalización del mismo, debe cargarse dicha operación.

Se representa este proceso formado por:

  • Tareas Manuales: Autorizar OC Nivel 1, Autorizar OC Nivel 2, Modificar OC, Notificar solicitante y Recepción (esta última es una tarea manual de gestión externa, la misma ejemplifica el caso de transacción que actualiza casos)
  • Tareas con Scripting: Notificar al gerente de compras, Enviar OC Proveedor.
  • Compuertas: Autoriza1, Autoriza2, Completa. En estas se redirecciona el caso dependiendo de la aprobación o rechazo en la evaluación del paso previo. Si fue evaluado como correcto, el circuito del proceso apuntará a la siguiente actividad, y si no fue aprobado, la vuelta a la actividad anterior o cierre del circuito del proceso.

|501.99999999999994x294

Primero se realiza el dibujo del proceso como se indica en el diagrama. Al final se oprime Archivo/Actualizar proceso.

En la solapa BPM del proceso se puede visualizar el listado de actividades y compuertas y su tipo, además de su respectiva configuración de equipo y responsable en caso de que se hayan definido en la actividad.

|546x288.99999999999994

A modo de ejemplo para demostrar la edición del script (código que va a determinar el comportamiento de la compuerta) se debe hacer clic derecho en la compuerta Autoriza1 del diagrama, seleccionar la opción de Editar Configuración, y se edita el script con el botón editar.

|299.00000000000006x305

Para este ejemplo se va a introducir el siguiente código:

// importación de librerías

import app.bsuite.transacciones.operacion.OperacionHLP;

import app.bsuite.transacciones.operacion.model.OperacionVO;

import faf.app.base.security.session.model.SessionVO;

// declaración de variables y objetos

String sessionID = params.getSessionID();

UtilsHLP utils = new UtilsHLP(sessionID);

DBHelper dbh = params.getDBHelper();

// Soporte para operar con funciones básicas

BPMServiceHLP bpm = new BPMServiceHLP(sessionID, dbh);

CasoBPMAccionVO accion = params.get("Accion");

TransactionHLP transaction = new TransactionHLP(sessionID, dbh);

Integer estado = new Integer(0);

BigDecimal valorMaximo= new BigDecimal("20000");

//if que setea estado si evaluación no está vacío

if(!utils.isEmpty(accion.getAtributo("Evaluacion").getValor())) {

estado = new Integer(accion.getAtributo("Evaluacion").getValor());

}

else {

accion.setCancelada();

}

//declaración y seteo de Orden de Compra

OperacionVO OC = OperacionHLP.getByPrimaryKey(new OperacionVO(sessionID), accion.getTransaccionID(), dbh, false);

//declaración y seteo de importe en la moneda principal

BigDecimal cotizacion = OperacionHLP.getCotizacion(dbh, accion.getTransaccionID(), OC.getMonedaID());

BigDecimal importe=BSuiteClientFunctions.getCambioMonedaLocal(OC.getImporteTotal(),cotizacion, dbh);

//Hay 2 If, el primer if controla la respuesta que ingresó el usuario en el XML

// el segundo if evalúa el monto del pedido

if( Integer.valueOf(1).equals(estado) ) {

//utiliza el método firmar para que la transacción no pueda editarse

transaction.firmar(accion.getTransaccionID());

// compareTo es lo mismo que 20000-importe. Si esa resta es < 0 es lo mismo que decir que importe > 20000

if (valorMaximo.compareTo(importe)<=0 ) {

//entra aquí si el pedido>20000 y bifurca a la actividad "Autorizar OC Nivel 2"

bpm.bifurcarHacia(accion, "Autorizar OC Nivel 2");

//setea el valor 0 al campo Evaluacion de TPCASO

accion.getAtributo("Evaluacion").setValor(0);

}

else {

//bifurca a la actividad "Enviar OC Proveedor"

bpm.bifurcarHacia(accion, "Enviar OC Proveedor");

}

}

else if( Integer.valueOf(2).equals(estado) ) {

bpm.bifurcarHacia(accion, "Notificar Solicitante");

}

else if( Integer.valueOf(3).equals(estado) ) {

//utiliza el método desfirmar para permitir la edición de la transacción

transaction.desfirmar(accion.getTransaccionID());

accion.getAtributo("Evaluacion").setValor(0);

bpm.bifurcarHacia(accion, "Modificar OC");

}

Luego se debe configurar la tarea Autorizar OC Nivel 1, para que, cuando se ejecuta esa tarea, aparezca un campo donde el usuario pueda seleccionar si aprueba o no la Orden de Compra.

Al hacer clic derecho en la tarea Autorizar OC Nivel 1 del diagrama, se selecciona Editar Configuración y se oprime el botón Editar, a la derecha del campo XML.

|299.00000000000006x389.99999999999994

En la ventana se escribe el código XML donde se indican los campos que va a completar el usuario, los valores posibles a seleccionar, el nombre de los campos adicionales donde la información se guardará en la tabla de casos y la ubicación donde van a aparecer los campos.

XML utilizado:

<?xml version="1.0" encoding="UTF-8"?>

<form type="convert">

<layout>

<widget type="WidgetComboBox" id="Evaluacion" caption="Evaluacion" after="Titulo" serverAttribute="Evaluacion">

<option value="1" caption="Aprobar"/>

<option value="2" caption="Rechazar"/>

<option value="3" caption="Modificar"/>

</widget>

</layout>

</form>

Hay que tener en cuenta las configuraciones a establecer en los documentos involucrados en este proceso. Como seguimiento del ejemplo, se muestran las configuraciones propias de los workflows y documentos que las requieran. Es importante remarcar que dentro del documento Orden de Compra, operación que inicia este proceso, debe establecerse en su configuración un Seguimiento cuyo modo sea Por Proceso, y a la hora de definir qué proceso utilizar seleccionar el correcto (en el ejemplo se utiliza Autorización de Orden de Compra).

|602x62.999999999999986

Por otra parte, dentro del workflow debe especificarse en qué intervalo del mismo se va a desarrollar el proceso. En el ejemplo, se tiene un workflow de compras donde el proceso se desarrolla entre las actividades Orden de Compra y Recepción. Para ello se configura en el workflow haciendo clic en el paso del mismo (donde el origen es la Orden de Compra y el destino la Recepción). En la ventana que se abre se debe configurar el campo Proceso.

|311x212.99999999999997

Casos que crean transacciones

Finalmente, existe la posibilidad de que un Caso genere una transacción.

Para esto hay una serie de requisitos de configuración que hay que establecer en el proceso y particularmente en la tarea que disparará la creación de la transacción:

  • El ejemplo a continuación está basado en un proceso de oportunidad comercial, en el cual el caso correspondiente genera una transacción de Pedido de Venta.
  • Accedemos desde Menú → CRM → Oportunidades Comerciales.
  • En el diagrama ejemplo puede verse como la última actividad (Generar Pedido de Venta) es del tipo Transacción Live.
  • Posteriormente, debe configurarse, dentro de la actividad (Clic derecho - Editar Configuración), el script que genera la transacción (en el ejemplo la transacción Pedido de venta se genera una vez que se ejecute la última tarea y se finalice el caso).

|602.0000000000001x257

En el diagrama del ejemplo, se puede observar las distintas actividades hasta llegar al Pedido de Venta.

Se completa la solapa presupuesto, con los datos correspondientes a la oportunidad comercial.

|415x237.99999999999997

Luego de completar todas las actividades y concluir en la tarea Generar Pedido de Venta de tipo Transacción Live, presionamos PLAY.

|387.00000000000006x225.99999999999994

Se puede observar la apertura de una ventana de creación del documento Pedido de Venta.

Se completan los datos del Pedido de Venta, se guarda y al cerrarse, la actividad queda finalizada, y se puede observar en la solapa Transacciones Asociadas, el Pedido de Venta generado.

OBSERVACIÓN: Se puede configurar el script de la actividad Generar Pedido de Venta de la siguiente manera, para que se auto-completen los datos pertinentes plasmados en el caso, correspondientes al cliente y los respectivos ítems:

import app.bsuite.transacciones.operacion.OperacionHLP;

import app.bsuite.transacciones.operacion.model.OperacionVO;

import app.bsuite.transacciones.operacion.OperacionSubtipoHLP;

import app.bsuite.transacciones.operacion.model.OperacionSubtipoVO;

import app.bsuite.transacciones.operacion.model.OperacionItemProductoVO;

import app.bsuite.servicios.dimension.model.DimensionTransaccionVO;

import app.bsuite.servicios.dimension.DimensionTransaccionHLP;

import app.bsuite.servicios.dimension.DimensionTransaccionSRV;

import app.bsuite.configuracion.contabilidad.model.CuentaVO;

import app.teamplace.transacciones.casoSaleForce.CasoSaleForceHLP;

import app.teamplace.transacciones.casoSaleForce.model.CasoSaleForceVO;

import app.teamplace.transacciones.casoSaleForce.model.CasoSaleForceItemProductoVO;

import faf.dynamicform.form.server.UserDataValue;

DBHelper dbh = params.getDBHelper();

String sessionID = params.getSessionID();

CasoBPMAccionVO accion = params.get("Accion");

ActividadTransaccionScriptResultado result = new ActividadTransaccionScriptResultado();

OperacionVO pedidoVenta = new OperacionVO(accion.getSessionID());

UtilsHLP utils = new UtilsHLP(sessionID, dbh); // Soporte para operar con funciones básicas

DimensionTransaccionSRV srv = new DimensionTransaccionSRV();

pedidoVenta.setTransaccionSubtipoID(new Long(168));

OperacionHLP hlp = new OperacionHLP();

pedidoVenta = hlp.getForTransaccion(pedidoVenta, new Long(0));

Integer TIPO_PRECIO_SOBRE_CANT_WORKFLOW = new Integer(0);

CasoSaleForceVO caso = CasoSaleForceHLP.getByPrimaryKey(new CasoSaleForceVO(sessionID), accion.getTransaccionID(), dbh, false);

//asignarle la organización contemplada en el caso al pedido de venta generado

pedidoVenta.setOrganizacionID(caso.getOrganizacionID());

//creo un vector

Collection pedidoVentaItems = new Vector();

//recorro los items del caso (casoItem) y los voy colocando uno por uno en pedidoVentaItem y agregándolo al vector

for (Iterator item = caso.getProductosItems().iterator(); item.hasNext();){

CasoSaleForceItemProductoVO casoItem = (CasoSaleForceItemProductoVO)item.next();

OperacionItemProductoVO pedidoVentaItem = new OperacionItemProductoVO(sessionID);

pedidoVentaItem.setProductoID(casoItem.getProductoID());

pedidoVentaItem.setCantidadWorkflow(casoItem.getCantidad());

pedidoVentaItem.setItemIdOrigen(casoItem.getPrimaryKey());

pedidoVentaItem.setPrecioTipo(TIPO_PRECIO_SOBRE_CANT_WORKFLOW);

pedidoVentaItem.setPrecio(casoItem.getPrecio());

pedidoVentaItem.calculateImporte(dbh);

pedidoVentaItems.add(pedidoVentaItem);

}

//agrego el vector al Pedido de Venta (los items)

pedidoVenta.setOperacionItems(pedidoVentaItems,"");

result.setEntidadVO(pedidoVenta);

El documento generado obtiene el dato de la organización / cliente proveniente de la cabecera del caso y los datos pertenecientes a los ítems desde la solapa Presupuesto:

Configuraciones necesarias

Equipos

Los equipos definidos en los procesos tienen que ser de Tipo de equipo = Equipo y Rol

Configuración de la aplicación Open Frame

Para las prestaciones en que el sistema envía mails se debe configurar el Open Frame con el servicio de correos de la empresa.

Ejemplos de procesos BPM

Autorización de pedidos según crédito del cliente

Orden de Compra - 2 niveles de autorización

Procesos con Pop Up

Cómo cancelar otra actividad pendiente

Eventos de recepción de señales

Autorización de OC por niveles dinámicos

Pago con descuento

2 Me gusta