Você está na página 1de 15

AWE: Application Workflow Engine

En est entrada vamos a ver el nuevo (Nuevo desde la versin 8.48) framework para incluir Workflows dentro de nuestras aplicaciones. La gran ventaja que presenta este framework frente a la anterior tecnologa de workflow presente en PEOPLESOFT, es que despus de implantar el workflow dentro de nuestro aplicativo, no es necesario realizar trabajo tcnico adicional, ya que todo el mantenimiento y parametrizacin adicional del workflow se puede realizar a travs de la PIA. Lo primero que vamos a hacer son los pasos que se deben realizar por un tcnico para poder incluir el worflow dentro del aplicativo. Para nuestro ejemplo necesitamos una pgina donde vamos a registrar los diferentes equipos deportivos, supongamos que ya tenemos la pgina y se ve de la siguiente forma:

Digamos que a este componente deseamos agregarle la funcionalidad del workflow, que para cada equipo que se adicione a la base de datos debe pasar por un proceso de aprobacin.

El primer paso es agregar al registro principal de nuestro componente (PE_EQUIPOS) un campo que represente el estado del equipo. El campo debe permitir 3 valores:

P:Pendiente A:Aprobado R:Rechazado

Adicionalmente

debemos

crear

un

registro

derived

que

contendr

campos:

- Un campo que representar el botn Enviar el que permitira iniciar el proceso de aprobacin del registro

- Un segundo campo que representar el botn de Aprobar que permitir al aprobador aprobar el registro. - Un tercer campo que representar el botn de rechazar que permitir al aprobador rechazar el registro. - Y un ltimo campo que permitir ingresar comentarios al momento de aprobar o rechazar un registro. Despus de agregar estos campos la pgina de nuestro componente debe lucir de la siguiente forma:

El siguiente paso es crear el registro que permitir llevar el control de los procesos de aprobacin de cada uno de los equipos, en este record (de tipo SQL TABLE) se almacena el rastreo del workflow que estamos definiendo. El registro debe ser construido de la siguiente forma: 1. Debe tener todos los campos llave del record principal de nuestro componente (en nuestro caso PE_EQUIPOS y la llave sera PE_ID_EQUIPO) 2. Debe incluir el subrecord EOAW_XREF_SBR.

Ahora debemos crear un Application Class que permita manejar el proceso del workflow. Esta clase permite bsicamente controlar la actualizacin del estado del registro, o sea permite actualizarlo a Pendiente, Aprobado o Rechazado segn sea el caso.

Est clase debe ser una clase derivada de la clase base EOAW_CORE:ApprovalEventHandler y debe implementar los siguientes mtodos:

1. OnProcessLaunch: En este mtodo se actualiza el estado del registro a P para indicar que el proceso acaba de iniciar y que el registro se encuentra pendiente de aprobacin

2. OnHeaderApprove: En este mtodo se actualiza el estado del registro a A para indicar que el registro se encuentra aprobado 3. OnHeaderDeny: En este mtodo se actualiza el estado del registro a R para indicar que el registro se encuentra rechazado La clase padre posee una propiedad llamada &appInst que nos permite acceder a algunos mtodos y propiedades para distintos procesos, en nuestra clase ejemplo utilizamos el mtodo &appInst.thread.SetAppKeys para obtener la llaves del registro para el cual se est realizando el proceso de Workflow, en nuestro caso PE_EQUIPOS y la llave PE_ID_EQUIPO. Por ltimo la clase tiene un mtodo privado cuya finalidad es ejecutar el UPDATE sobre el campo estado del registro PE_EQUIPOS el cual es utilizado desde los otros 3 mtodos. A continuacin podemos ver el cdigo completo de la clase: import EOAW_CORE:*; import EOAW_CORE:ENGINE:*; class PE_APPROVAL_HANDLER extends EOAW_CORE:ApprovalEventHandler method PE_APPROVAL_HANDLER(); method OnProcessLaunch(&appInst As EOAW_CORE:ENGINE:AppInst); method OnHeaderApprove(&appinst As EOAW_CORE:ENGINE:AppInst); method OnHeaderDeny(&userinst As EOAW_CORE:ENGINE:UserStepInst); private method updateProcessFlag(&status As string); instance Record &RecordEquipo; Constant &APPROVED = "A"; Constant &DENIED = "D"; Constant &PENDING = "P"; end-class; method PE_APPROVAL_HANDLER %Super = create EOAW_CORE:ApprovalEventHandler(); &RecordEquipo = CreateRecord(Record.PE_EQUIPOS); end-method; method updateProcessFlag /+ &status as String +/ Local string &IdEquipo; &IdEquipo = &RecordEquipo.PE_ID_EQUIPO.Value; SQLExec(SQL.PE_EQUI_UPD_APPR_FLAG, &status, &IdEquipo); end-method; method OnProcessLaunch /+ &appInst as EOAW_CORE:ENGINE:AppInst +/ /+ Extends/implements EOAW_CORE:ApprovalEventHandler.OnProcessLaunch +/ &appInst.thread.SetAppKeys(&RecordEquipo);

%This.updateProcessFlag(&PENDING); end-method; method OnHeaderApprove /+ &appinst as EOAW_CORE:ENGINE:AppInst +/ /+ Extends/implements EOAW_CORE:ApprovalEventHandler.OnHeaderApprove +/ &appinst.thread.SetAppKeys(&RecordEquipo); %This.updateProcessFlag(&APPROVED); end-method; method OnHeaderDeny /+ &userinst as EOAW_CORE:ENGINE:UserStepInst +/ /+ Extends/implements EOAW_CORE:ApprovalEventHandler.OnHeaderDeny +/ &userinst.thread.SetAppKeys(&RecordEquipo); %This.updateProcessFlag(&DENIED); end-method; El siguiente paso dentro de nuestra implantacin del workflow es escribir el cdigo que inicia los objetos necesarios para el proceso, esto se debe realizar el el evento POSTBUILD del componente. Antes de eso vamos a escribir una clase que nos permite controlar la visualizacin de los botones de Aprobacin, Rechazo y Envo del componente. Esta clase debe permitir a partir de una instancia de la clase EOAW_CORE:LaunchManager y otra de la clase EOAW_CORE:ApprovalManager determinar si el usuario que est accediendo al componente es aprobador, si es as habilitar los botones de aprobacin y rechazo. Si el proceso est pendiente de ser iniciado la clase habilitar el botn Enviar. Para determinar si un usuario est habilitado para aprobar o rechazar la transaccin se utiliz la propiedad hasPending del objeto EOAW_CORE:ApprovalManager la cual indica si el usuario que ingreso al objeto tiene pendiente realizar una aprobacin sobre el registro. Para determinar si el registro est pendiente de iniciar el proceso de Workflow se usa la propiedad submitEnabled del objeto EOAW_CORE:LaunchManager. La clase quedara de la siguiente forma: import EOAW_CORE:LaunchManager; import EOAW_CORE:ApprovalManager; class PE_UTILIDADES method PE_UTILIDADES(); method pe_ActualizarWF(&rs0 As Rowset, &obj_launch EOAW_CORE:LaunchManager, &obj_approval As EOAW_CORE:ApprovalManager); private end-class; method PE_UTILIDADES end-method; method pe_ActualizarWF /+ &rs0 as Rowset, +/ /+ &obj_launch as EOAW_CORE:LaunchManager, +/ /+ &obj_approval as EOAW_CORE:ApprovalManager +/ Local Row &row1 = &rs0.GetRow(1);

As

Local Record &rec_approval = &row1.GetRecord(Record.PE_EQUIPOS_WRK); Local boolean &isApprover = False; If &obj_approval.hasAppInst Then &isApprover = &obj_approval.hasPending; End-If; &rec_approval.PE_ENVIAR_BTN.Visible = &obj_launch.submitEnabled; &rec_approval.PE_APROBAR_BTN.Visible = &isApprover; &rec_approval.PE_RECHAZAR_BTN.Visible = &isApprover; end-method; Ya habiendo construida est clase podemos escribir el cdigo del evento postbuild del componente: Importamos las clases propias del AWE que necesitamos import EOAW_CORE:LaunchManager; import EOAW_CORE:ApprovalManager;

Importamos la clase que acabamos de crear para habilitar los botones segn el estado del proceso y el usuario que est ingresando al registro:
import PE_WF_EJEMPLO:PE_UTILIDADES;

Declaramos las variables de componente que se utilizan durante todo el proceso de Workflow:
Component EOAW_CORE:LaunchManager &obj_launch; Component EOAW_CORE:ApprovalManager &obj_approval;

Creamos la variable para almacenar el nombre del proceso que vamos a ejecutar. Este es el nombre con el cual se va a identificar el proceso y el que se debe parametrizar en las pginas de parametrizacin d workflow.
Local string &str_process = "EQUIPOS";

Creamos la variable record para el cual se ejecutar el workflow.


Local Record &rec_equipos = GetRecord(Record.PE_EQUIPOS);

Inicializamos las variables de componente que se utilizan durante todo el proceso de Workflow, los parmetros identifican el proceso de workflow que se va a ejecutar para el registro y con que usuario se est ejecutando ese proceso.
&obj_launch = create EOAW_CORE:LaunchManager(&str_process, &rec_equipos, %OperatorId);

&obj_approval = create EOAW_CORE:ApprovalManager(&str_process, &rec_equipos, %OperatorId);

Actualizamos el estado de los botones de aprobacin, rechazo y envo.


Local PE_WF_EJEMPLO:PE_UTILIDADES &obj_utilidades = create PE_WF_EJEMPLO:PE_UTILIDADES();; &obj_utilidades.pe_ActualizarWF(GetLevel0(), &obj_launch, &obj_approval); El siguiente paso es escribir el cdigo que ejecutar cada uno de los botones. El cdigo que se colocar directamente en los bonotes solo activar una bandera y salvar el componente, esto con el fin de ejecutar el cdigo principal en el evento SavePostChange del componente. Botn Aprobar: PE_EQUIPOS_WRK.PE_APROBAR_BTN.Value = "Y"; &XSTATUS = PE_EQUIPOS.PE_ESTADO_EQUIPO; PE_EQUIPOS.PE_ESTADO_EQUIPO = ""; PE_EQUIPOS.PE_ESTADO_EQUIPO = &XSTATUS; DoSaveNow(); Botn Rechazar: PE_EQUIPOS_WRK.PE_APROBAR_BTN.Value = "Y"; &XSTATUS = PE_EQUIPOS.PE_ESTADO_EQUIPO; PE_EQUIPOS.PE_ESTADO_EQUIPO = ""; PE_EQUIPOS.PE_ESTADO_EQUIPO = &XSTATUS; DoSaveNow();

Botn Enviar: PE_EQUIPOS_WRK.PE_ENVIAR_BTN.Value = "Y"; &XSTATUS = PE_EQUIPOS.PE_ESTADO_EQUIPO; PE_EQUIPOS.PE_ESTADO_EQUIPO = ""; PE_EQUIPOS.PE_ESTADO_EQUIPO = &XSTATUS; DoSaveNow(); Ahora si vamos a revisar el cdigo que debemos colocar en el evento SavePostChange del Componente:

Importamos las clases propias del AWE que necesitamos import EOAW_CORE:LaunchManager; import EOAW_CORE:ApprovalManager;

Importamos la clase que acabamos de crear para habilitar los botones segn el estado del proceso y el usuario que est ingresando al registro:

import PE_WF_EJEMPLO:PE_UTILIDADES;

Declaramos las variables de componente que se utilizan durante todo el proceso de Workflow:
Component EOAW_CORE:LaunchManager &obj_launch; Component EOAW_CORE:ApprovalManager &obj_approval; Local PE_WF_EJEMPLO:PE_UTILIDADES &obj_utilidades = create PE_WF_EJEMPLO:PE_UTILIDADES();;

Creamos la variable record para el cual se ejecutar el workflow.


Local Record &rec_equipos = GetRecord(Record.PE_EQUIPOS);

Creamos la variable record donde se encuentran los campos referentes a los botones:
Local Record &rec_wrk = GetRecord(Record.PE_EQUIPOS_WRK);

Validamos si se oprimi el botn enviar y si es as inicializa el proceso de workflow utilizando el mtodo DoSubmit. Siempre que se inicie o se reinicie un proceso de workflow la variable EOAW_CORE:ApprobalManger debe ser reiniciada. La propiedad hasAppInst indica si el proceso fue iniciado correctamente.
If &rec_wrk.PE_ENVIAR_BTN.Value = "Y" Then &obj_launch.DoSubmit(); If &obj_launch.hasAppInst Then &obj_approval = create EOAW_CORE:ApprovalManager(&obj_launch.txn.awprcs_id, &rec_equipos, %OperatorId); End-If; Else Validamos si se oprimi el botn aprobar y si es as se llama el mtodo DoApprove para realizar la aprobacin del registro. Si el usuario que est aprobando no es el aprobador final y existen otros usuario que deben aprobar antes de que el registro quede en estado aprobado, el mtdo DoApprove dejar el estado en pendiente y remitir la transaccin al siguiente aprobador If &rec_wrk.PE_APROBAR_BTN.Value = "Y" Then &obj_approval.DoApprove(&rec_equipos); Else Validamos si se oprimi el botn rechazar y si es as se llama el mtodo DoDeny para realizar el rechazo del registro.

If &rec_wrk.PE_RECHAZAR_BTN.Value = "Y" Then &obj_approval.DoDeny(&rec_equipos); Else

Si el proceso de workflow ya se ha iniciado pero alguien le hizo alguna modificacin al registro, es necesario volver a iniciar el proceso de aprobacin, para eso se utiliza el mtodo DoResubmit el cual resetea el proceso y lo inicia nuevamente.

If &obj_approval.hasAppInst And &obj_launch.resubmitEnabled Then &obj_launch.DoResubmit(); End-If; End-If; End-If; End-If; Por ltimo actualizamos el estado de los botones de workflow: &obj_utilidades.pe_ActualizarWF(GetLevel0(), &obj_launch, &obj_approval); &rec_wrk.PE_ENVIAR_BTN.Value = "N"; &rec_wrk.PE_APROBAR_BTN.Value = "N"; &rec_wrk.PE_RECHAZAR_BTN.Value = "N"; Con lo anterior finalizamos los pasos tcnicos que son necesarios para habilitar el workflow dentro de un componente especifico, el siguiente paso es parametrizar el proceso dentro del aplicativo.

Las parametrizaciones del AWE se realiza por el men Inicio > Componentes de Empresa > Aprobaciones > Aprobaciones. En esta ruta encontramos todas las opciones que nos permiten parametrizar el workflow. 1. Primero se debe registrar la trasaccin, por la opcin de Registro de Transacciones. El id de proceso que debemos registrar para nuestro ejemplo es EQUIPOS, el cual es el que hemos estado utilizando dentro del PeopleCode.

Lo principal que se debe parametrizar en este punto son: El registro de referencia subrecord EOAW_XREF_SBR). (El registro que creamos utilizando el

La opcin de Activar notificaciones, donde definimos si queremos informar a los interesados en el workflow (Solicitantes, aprobadores, etc.) por correo electrnico, por lista de trabajo o por ambos. El men y el componente donde se realizan las aprobaciones. Hacia este men y componente redireccionar el motor de workflow a los interesados (Aprobadores) para continuar con el proceso.

Clase de Gestin de Aprobacin, ac seleccionamos la clase que administrar el estado de los registros que se encuentren en proceso de aprobacin. En nuestro caso ser PE_APPROVAL_HANDLER En Niveles de Aprobacin seleccionamos el registro al que le vamos a realizar el proceso de aprobacin. A continuacin podemos visualizar como quedara la definicin del proceso EQUIPOS:

2. La segunda configuracin que se debe hacer es la que se refiere a las notificaciones que se deben enviar cada vez que ocurra un evento dentro del proceso de workflow. Para esto se debe definir:

La vista de usuarios que se va a utilizar (Usuarios Aprob): a menos que suceda algo extraordinario o que se necesite informacin adicional de los usuarios la vista que siempre se debe usar es PSOPRDEFN_VW El evento para el cual se realizar la notificacin: Bsicamente se deben parametrizar 3 eventos: En Aprobacin Final, En Rechazo Final y Ruta para Aprobacin. Luego se define el men, componente y pgina al cual se debe dirigir el notificado para realizar el proceso de workflow (Aprobar, Rechazar o Revisar segn el caso) Por ltimo se define el perfl al cual se debe notificar: En el caso de Rechazo y Aprobacin Final se debe informar al solicitante para que este revise por que se rechazo o por que se aprob. En caso de Runta para Aprobacin se le debe informar al usuario que debe aprobar o rechazar la transaccin o sea a los aprobadores. A continuacin se pueden visualizar las parametrizaciones que se realizaron para los 3 eventos dentro de nuestro ejemplo.

3. El siguiente paso es definir las listas de usuarios que realizarn aprobaciones dentro del workflow. Ests listas se pueden definir con base en un App Package, un Objeto SQL, un Rol o una consulta realizada por el gestor de consultas. Las listas de usuarios se definen por la opcin Definicin Lista Usuarios. Para nuestro ejemplo definiremos 3 listas de usuarios, cada una apuntando a un rol diferente. Utilizaremos 3 listas de usuarios por que tendremos 3 niveles de aprobacin, o sea que un registro debe ser aprobado por 3 usuarios antes de cambiar de estado a Aprobado. A continuacin podemos ver la primer lista de usuarios que se parametriz (En entradas posteriores revisaremos los diferentes tipos de listas de usuario, y la forma de usar el control ruta para las listas de usuarios definidas como roles.):

4. El ltimo paso a la hora de definir un workflow es definir el proceso de aprobacin. Cada proceso consta de: Fases: Todas las fases se deben ejecutar dentro de un proceso y son secuenciales una detrs de otra. Las fases estn compuestas por Rutas: dentro de una fase las diferentes rutas son paralelas. A diferencia de las fases las rutas no necesariamente deben ser ejecutadas. Para que una ruta sea ejecutada debe cumplir los criterios definidos sino ser ignorada. Por ltimo las rutas estn compuestos por pasos que deben ser ejecutados de forma secuencial y que a su vez pueden ser ignorados si no cumplen los criterios definidos para el paso. Dentro del paso se define la lista de usuarios que debe realizar la aprobacin del paso. Para nuestro ejemplo se debe ingresar en cada uno de los criterios de las rutas, los pasos y el proceso y definirlo como se ve en la siguiente imagen:

La definicin del proceso de nuestro ejemplo debe quedar como la siguiente figura:

5. Se me olvidaba, si deseamos poder hacer seguimiento a cada una de nuestras transacciones dentro del proceso de aprobacin utilizando la opcin Control de Aprobaciones, debemos agregar nuestro Id de Proceso a la opcin Configuracin del Monitor y debe quedar de la siguiente forma:

Listo ahora solo nos queda probar nuestro workflow, para lo anterior debemos crear los siguientes usuarios:

Solicitante: Usuario con permisos sobre el componente de equipos.

Aprobador 1: Usuario con permisos sobre el componente de equipos y adicionalmente con el rol asociado a la lista de usuarios PE_EQUIPOS_UNO Aprobador 2: Usuario con permisos sobre el componente de equipos y adicionalmente con el rol asociado a la lista de usuarios PE_EQUIPOS_DOS Aprobador 3: Usuario con permisos sobre el componente de equipos y adicionalmente con el rol asociado a la lista de usuarios PE_EQUIPOS_TRES. 1. El primer paso de nuestra prueba es ingresar un registro en el componente de equipos, para eso ingresamos con el usuario Solicitante y creamos un equpo:

Como podemos ver al usuario solicitante se le habilita el botn enviar. Al dar clic en el botn enviar se iniciar el proceso de aprobacin y se le ocultar el botn enviar para el usuario Solicitante. Si vamos a la opcin Inicio > Componentes de Empresa > Aprobaciones > Aprobaciones > Control de aprobaciones y buscamos por el Proceso "EQUIPOS" podemos ver que el equipo se encuentra en estado pendiente. Si ingresamos al registro podremos ver graficamente como va el proceso de aprobacin, incluso los pasos que faltan antes de la aprobacin final. 2. El segundo paso en nuestro ejemplo es ingresar al aplicativo con el usuario Aprobador 1 e ir a revisar nuestra lista de trabajo. Como podemos ver en la imagen tenemos pendiente una aprobacin.

3. Mediante el link que aparece en la lista de trabajo nos dirigimos hacia el componente de equipos al registro pendiente por aprobacin. En la imagen se ve que ahora se encuentran habilitados el botn Aprobar y Rechazar.

4. El siguiente paso es aprobar la transaccin e ingresar con los usuarios Aprobador 2 y Aprobador 3 y terminar el proceso completo hasta que el estado del registro quede aprobado. Con esto hemos terminado nuestra entraba bsica sobre el manejo del AWE. En futuras entradas estaremos estudiando caractersticas adicionales de est tecnologa, como son: Control Ruta Criterios de Seleccin de Rutas y Pasos