sábado, 23 de julio de 2011

Herramientas de Notificación Parte III: Notification Framework

Para nuestra última entrada dedicada a los frameworks de notificación, vamos a hablar del “Notification Framework” el cual nos permite generar correos electrónicos y notificaciones a las listas de trabajo de los usuarios.

Digamos que queremos hacer una notificación que se dispare al momento de modificar o crear un nuevo cliente en nuestra aplicación.

Para lograr lo anterior lo primero que tenemos que hacer es agregar un proceso y una categoría al "Notification Framework". El proceso puede ser CustomerManagement y la categoría UpdateOrCreate. Para crear estos objetos nos dirigimos a Inicio - Componentes de Empresa - Eventos y Notificaciones - Entorno de Notificaciones - Registro de Notificaciones y creamos un registro que se vea como la imagen mostrada a continuación: 


El siguiente paso es crear el registro de contexto de nuestro proceso. El registro de contexto de un proceso contiene datos que nos permiten identificar los objetos a los que corresponde la notificación, además el registro de contexto de un proceso se puede visualizar en la consola de notificaciones lo cual hace más facil identificar las razones de la notificación.

Todo registro de contexto debe tener como mínimo el subrecord EOEN_LOG_KEY, adicionalmente para nuestro ejemplo vamos a incluir el  SETID y el CUST_ID del cliente que está siendo modificado; y el OPRID del usuario que está modificando o creando el cliente. El registro lo llamaremos PE_CUST_CTX. 

El registro debe quedar de la siguiente forma




Después de crear el registro de contexto vamos al registro CUSTOMER, al campo SETID y al evento SAVEPOSTCHANGE. 

Lo primero que vamos a hacer es importar los paquetes del "Notifications Framework" que vamos a utilizar:

import EOEN_MVC:EOEN_MODEL:*;
Luego vamos a declarar un objeto del tipo EOENInteface que es la clase que nos permite generar las notificaciones.

Local EOEN_MVC:EOEN_MODEL:EOENInterface &oEwnInterface;

A continuación creamos el objeto de tipo EOENInterface para el proceso CustomerManagement que acabamos de crear, el segundo parámetro es una instancia de proceso para la cual generamos un aleatorio (si estamos usando la clase EOENInterface dentro de un app engine podemos utilizar el ProcessInstance como segundo parámetro):
&oEwnInterface = create EOEN_MVC:EOEN_MODEL:EOENInterface("CUSTOMERMANAGEMENT", Int(Rand() * 100000000));  
Luego creamos el registro de contexto 
Local Record &ContextRec;
&ContextRec = CreateRecord(Record.PE_CUST_CTX);

Asignamos los valores del ContextRecord empezando por el proceso y la categoría; y continuando con los datos adicionales que definimos.

&ContextRec.EOEN_PRCS_NAME.Value = "CUSTOMERMANAGEMENT";
&ContextRec.EOEN_CATEGORY.Value = "UpdateOrCreate";
&ContextRec.SETID.Value =CUSTOMER.SETID.Value;
&ContextRec.CUST_ID.Value =CUSTOMER.CUST_ID.Value;
&ContextRec.OPRID.Value = %OperatorId;

Ahora iniciamos la categoría del objeto &oEwnInterface

&oEwnInterface.EOENCategory = "UpdateOrCreate";

Agregamos el Record de contexto al objeto:

&oEwnInterface.AddContextRecord(&ContextRec);

Digamos que queremos notificar al administrador (VP1)  vía correo electrónico sobre la modificación o creación del usuario, para lograr esto utilizamos el método  AddEmailByOprID. 

&oEwnInterface.AddEmailByOprID(%OperatorId);
&oEwnInterface.GenerateEmail( True);

Supongamos que también queremos notificar a los usuarios vía lista de trabajo a los miembros del rol "CUST_MANAGERS". Para lo anterior utilizamos el método GenerateWL:

&oEwnInterface.GenerateWL( True, "", "CUST_MANAGERS");

Lo otro que nos permite el "Notification Framework" es definir la URL a la que referencia la notificación, en nuestro caso sería la dirección del componente de clientes para el cliente que fue modificado.  

&oEwnInterface.EOENRedirectURL =
GenerateComponentPortalURL("EMPLOYEE", "ERP", MenuName.MAINTAIN_CUSTOMERS, "GBL", Component.CUSTOMER_GENERAL, "" ,"U", CUSTOMER.SETID, CUSTOMER.CUST_ID);

Por último llamamos el método log para generar la notificación:
Local array of string &ArrayOfBindVals;
&ArrayOfBindVals = CreateArray(CUSTOMER.CUST_ID, %OperatorId);
 
&oEwnInterface.Log(0, 0, "Fue modificado un cliente", &ArrayOfBindVals);

Debemos recordar agregar el rol CUST_MANAGERS  a los usuarios a los cuales deseamos les sean notificadas las actualizaciones de los clientes en las listas de trabajo. También debemos recordar asignarle un correo electrónico al usuario VP1.
Luego podemos ir a cualquier cliente y modificarlo,  y revisar la notificación por la consola de notificaciones y se verá de la siguiente forma:  
 
Si damos clic en el link de ver contexto el sistema nos mostrará el registro de contexto que agregamos a nuestra notificación

Si damos cliente en el link  Ver Detalle Transacción el sistema nos llevará al cliente que fue modificado. 

Si ingresamos al sistema con un usuario que pertenezca al rol. CUST_MANAGERS y vamos a la lista de trabajo vamos a encontrar las notificaciones generadas, como se puede ver a continuación:


 Está información también la podemos visualizar en el correo del usuario VP1. 

Por último si queremos parametrizar el rol al cual queremos notificar, podemos hacer para todo el sistema o por unidad de negocio, para eso vamos a las ruta Inicio - Componentes de Empresa - Eventos y Notificaciones - Entorno de Notificaciones - Modific. Sistema Notificaciones o Modific. UniNeg Notificaciones, y ahí adicionamos un registro para el proceso y categoría que creamos, y asignamos el rol al que queremos notificar y el correo electrónico también. 

Bueno espero que podamos poner en práctica estas herramientas de las que hablamos en las últimas 3 semanas y que logren hacer nuestro trabajo más facil y de mejor calidad. Nos vemos la próxima semana nuevamente. Se me olvidaba acá les dejo el código completo:


import EOEN_MVC:EOEN_MODEL:*;

Local EOEN_MVC:EOEN_MODEL:EOENInterface &oEwnInterface;

&oEwnInterface = create EOEN_MVC:EOEN_MODEL:EOENInterface("CUSTOMERMANAGEMENT", Int(Rand() * 100000000));

Local Record &ContextRec;
&ContextRec = CreateRecord(Record.PE_CUST_CTX);
&ContextRec.EOEN_PRCS_NAME.Value = "CUSTOMERMANAGEMENT";
&ContextRec.EOEN_CATEGORY.Value = "UpdateOrCreate";
&ContextRec.SETID.Value = CUSTOMER.SETID.Value;
&ContextRec.CUST_ID.Value = CUSTOMER.CUST_ID.Value;
&ContextRec.OPRID.Value = %OperatorId;
&oEwnInterface.EOENCategory = "UpdateOrCreate";
&oEwnInterface.AddContextRecord(&ContextRec);
rem &oEwnInterface.AddEmailByOprID(%OperatorId);
rem &oEwnInterface.GenerateEmail( True);

&oEwnInterface.GenerateWL( True, "", "CUST_MANAGERS");
&oEwnInterface.EOENRedirectURL = GenerateComponentPortalURL("EMPLOYEE", "ERP", MenuName.MAINTAIN_CUSTOMERS, "GBL", Component.CUSTOMER_GENERAL, "", "U", CUSTOMER.SETID, CUSTOMER.CUST_ID);

Local array of string &ArrayOfBindVals;
&ArrayOfBindVals = CreateArray(CUSTOMER.CUST_ID, %OperatorId);

&oEwnInterface.Log(0, 0, "Fue modificado un cliente", &ArrayOfBindVals);


jueves, 14 de julio de 2011

Herramientas de Notificación Parte II: Alert Framework


Bueno en esta segunda entrega sobre notificaciones vamos a ver el “Alert Framework”. Si no les gusto las notificaciones por medio de los FEEDS por las limitaciones que estos presentan, como son:
 
  • Tener que utilizar un software adicional para poder utilizarlo (el FeedReader) o
  • que para usarlo nuestra aplicación debe estar publicada en internet si queremos que estas notificaciones no lleguen a cualquier sitio, sino solo nos servirán dentro de la red donde se encuentre instalada la aplicación.

El “Alert Framework” nos permite generar alertas a partir de un Query de la misma forma en que lo hacen los FEEDS, pero utilizando el correo electrónico, con esto superamos las limitantes anteriormente mencionadas.

Digamos que tenemos el mismo ejemplo que utilizamos con los FEEDS, el administrados de PEOPLESOFT de la organización desea recibir alertas cada vez que es creado o modificado un usuario dentro del aplicativo.

Lo primero que tenemos que hacer es crear el Query que vamos a utilizar. Para los FEEDS utilizamos el Query

SELECT A.OPRID,
                 A.OPRDEFNDESC,
                 TO_CHAR(CAST((A.LASTUPDDTTM) AS TIMESTAMP),'YYYY-MM-DD-HH24.MI.SS.FF')
  FROM PSOPRDEFN A
Así como está el Query no nos sirve para utilizarlo dentro del “Alert Framework” debido a lo siguiente:  
  • El “Alert Framework” genera alertas para cada uno de los registros que retorne el Query, no como los FEEDS en los cuales el FeddReader se encargaba de identificar que alertas ya habían sido generadas y genera solo las faltanes.
  • También es necesario informarle al ”Alert Framework” quien es el destinatario de la alertar, con los FEEDS el destinatario era aquel que se suscribía al FEED.

Para solucionar los anteriores inconvenientes vamos a modificar nuestro Query de la siguiente forma:

Primero vamos a agregar el rol PE_ALERT, el cual lo asignaremos a todos los usuarios a los que queramos notificarles.

También agregaremos una condición al Query para que solo nos traiga los usuarios modificados en la última hora.

Después de las anteriores modificaciones el Query nos queda de la siguiente forma:

SELECT A.OPRID, A.OPRDEFNDESC, TO_CHAR(CAST((A.LASTUPDDTTM) AS TIMESTAMP),'YYYY-MM-DD-HH24.MI.SS.FF'), C.EMAILID
  FROM PSOPRDEFN A, PSROLEUSER_VW B, PSUSEREMAIL C
  WHERE  ( B.ROLENAME = 'PE_ALERT'
     AND B.OPRID = C.OPRID
     AND C.PRIMARY_EMAIL = 'Y'
     AND ROUND((CAST(( CAST(SYSTIMESTAMP AS TIMESTAMP)) AS DATE) - CAST((A.LASTUPDDTTM) AS DATE)) * 1440, 0) < 60 )
La Expresión ROUND((CAST(( CAST(SYSTIMESTAMP AS TIMESTAMP)) AS DATE) - CAST((A.LASTUPDDTTM) AS DATE)) * 1440, 0) se forma a partir del MetaSql %datetimediff(A.LASTUPDDTTM, %Currentdatetimein).
Ya con este Query podemos empezar a crear nuestra alerta. Lo primero que tenemos que hacer es definir una notificación, para esto vamos a Inicio – Componentes de Empresa – Eventos y Notificaciones – Entorno de Notificaciones – Registro de Notificaciones, ahí agregamos un nuevo registro que quede de la siguiente forma:




Antes de crear nuestra alerta debemos definir el mensaje que queremos que se envíe en el correo electrónico, para eso creamos un registro en el catálogo de mensajes con el mensaje: “Se modificó o se agregó el usuario %1”

Después de que definamos nuestra notificación vamos a crear nuestra alerta. Esto lo hacemos por Inicio – Componentes de Empresa – Eventos y Notificaciones – Avisos – Definición de Alertas.
Utilizando la consulta PS_USER, el proceso PS_USERS y la categoría NOTIFICACIONES:






En la pestaña URL definimos los parámetros que el Framework va a utilizar para generar una URL para acceder al componente de perfiles de usuarios al usuario que fue creado o modificado, directamente desde el correo sin necesidad de hacer una búsqueda manual:

Nota: Para que este ejemplo funcione correctamente recomiendo realizarlo con el usuario VP1, adicionalmente para que el Link de Detalle de la Transacción funcione, debemos cambiar el nodo del objeto de portal PT_USERMAINT_GBL de LOCAL_NODE a ERP, esto lo puedes realizar por Inicio – Peopletools – Portal – Estructura y Contenido, y ahí se busca la ruta para encontrar el objeto.




En el link de claves de búsqueda, mapeamos las claves del componente de Perfiles de Usuario, en este caso solo el OPRID para que se acceda directamente al usuario solicitado. 



En la pestaña Mensaje colocamos los datos de la entrada que agregamos en el catálogo de mensaje y el campo de la consulta que trae el correo electrónico al cual queremos notificar.





En el link Parámetros Mensaje ingresamos para mapear los datos de la consulta con los parámetros que tiene nuestro mensaje, en este caso solo %1 que es el usuario que se modificó.
 




Con esta definición ya podemos poner a trabajar nuestro proceso de alertas.
Nota: Hay que verificar que se haya configurado el SMTP en el process scheduler y listo, podemos ejecutar el proceso.
Para ejecutar el proceso de alertas vamos a Inicio – Componentes de Empresa – Eventos y Notificaciones – Avisos – Ejecución de Alertas. Sí queremos que esto se haga automático debemos programar una recurrencia para el proceso y ya.

Para hacer la prueba podemos modificar cualquier usurario, ejecutar el proceso y verificar si se generó la alerta.


El “Alert Framework” deja registro de todas las notificaciones realizadas, este registro se puede ver por Inicio – Componente de Empresa – Eventos y Notificaciones – Entornos y Notificaciones – Consola de Notificaciones. En la ruta anterior buscamos todas las notificaciones del proceso PS_USERS. Ahí encontramos el detalle del proceso, incluso los correos electrónicos que fueron notificados. Si damos clic en detalles de la transacción el sistema nos llevará al componente de Perfiles de Usuario, al usuario que se modificó.

Adicionalmente el Alert Framework nos permite generar Alertas a la lista de trabajo de los usuarios, para lograr este comportamiento debemos ir a la ruta Inicio – Componente de Empresa – Eventos y Notificaciones – Entorno  de Notificaciones – Modific Sistema Notificaciones y agregar un registro como el siguiente:



Después de agregar este registro, el sistema además de enviar el correo, también  generará una entrada en la lista de trabajo de los miembros del rol PE_ALERT.
Nota: Para que el sistema agregué correctamente la entrada a la lista de trabajo debemos insertar el siguiente registro (Esto solo si no existe un registro previamente):

INSERT INTO PSWLINSTMAX VALUES ('EOEN_WL_NOTIFY','EOEN_WL_ROUTE' ,'ROUTE' ,'Error and Warning Notification', 1).
Bueno espero que les haya gustado está entrada, que puedan utilizar está información y que si tienen alguna duda me cuentan y vemos si yo también tengo la misma duda.

lunes, 4 de julio de 2011

Herramientas de Notificación Parte I: FEEDS

Esta semana empezaremos una serie de 3 publicaciones enfocadas al tema de notificaciones. En esta primera entrada hablaremos de los FEEDS (http://es.wikipedia.org/wiki/Fuente_web). Para los que no estén familiarizados con los FEEDS a continuación podremos ver un ejemplo de un FEED y cómo se comporta; para los que ya estén familiarizados pueden pasar a la segunda parte.


A continuación vamos a ver un ejemplo de un FEED de una página de internet:


Digamos que nosotros somos muy fanáticos de la página de tecnología del periódico El Tiempo, y quisiéramos recibir una notificación cada vez que un artículo nuevo sea publicado en dicha página. Resulta que está página ofrece el servicio de FEEDS. Lo primero que debemos hacer para utilizar este servicio, es instalar un lector de rss o Feedreader (Outlook, Firefox, IE y Thunderbird lo tienen incorporado). Para nuestro ejemplo utilizaremos Feedreader el cual podemos descargarlo e instalarlo desde la dirección http://www.feedreader.com/download. Luego de instalarlo vamos a la página www.eltiempo.com y buscamos el siguiente link en la parte final de la página:




Luego le damos clic en la opción de tecnología y se copia la dirección http que aparece:




La dirección es la siguiente: http://www.eltiempo.com/tecnologia/rss.xml

Abrimos el FeedReader que acabamos de instalar. Luego vamos al menú Archivo - Nuevo - Canal y pegamos la dirección como podemos ver en la imagen y luego damos aceptar.





¿Qué sucederá a partir de ahora?, cada nuevo artículo de la sección de tecnología que sea publicado, será notificado al feedreader automáticamente y no nos perderemos ninguna información que allí publiquen.

Bueno ahora sí, ¿cómo aplicamos está tecnología a nuestras necesidades de notificación?, por ejemplo, que tal si el administrador de PEOPLESOFT del cliente quiere estar al tanto de todos los usuarios que se van creando o modificando dentro del aplicativo, entonces solicita que creemos una notificación para que cuando modifiquen un usuario o creen un usuario se genere un correo electrónico a su cuenta de correo o a la cuenta de correo de un grupo de usuarios para realizar el monitoreo.

La primera reacción del consultor es solicitar la modificación de la página del Administración de usuarios que incluya modificar el PEOPLECODE de los records involucrados y generar un correo electrónico, además de crear una página de parametrización donde se incluyan los usuarios a los que se les debe enviar el correo. Tiempo de Análisis, Diseño y Desarrollo 32 horas, resultado: modificación del estándar, posibles incidencias, necesidad de la disponibilidad del equipo técnico etc etc etc.

Con la tecnología del Feed Publishing Framework incluida en las Tools 8.51 podemos cumplir el anterior requerimiento con un mínimo esfuerzo técnico. El proceso sería crear un Query por el gestor de consultas que consulte la tabla de usuarios OPRDEFN, y el Feed Reader se encarga del resto; o sea nada de desarrollo técnico, nada de modificación del estándar etc. A Continuación podemos ver un ejemplo de cómo podemos solucionar el requerimiento:

creamos una consulta por el gestor de consultas que quede de la siguiente forma (Bueno cuanto tiempo le quitamos al técnico preguntandole como se llama el record donde se almacenan los usuarios?):



SELECT A.OPRID,
A.OPRDEFNDESC,
TO_CHAR(CAST((A.LASTUPDDTTM) AS TIMESTAMP),'YYYY-MM-DD-HH24.MI.SS.FF')
FROM PSOPRDEFN A



Despues de guardar la consulta, en la parte de abajo del gestor de consultas encontraremos un link que se llama “Publicar como Fuente”. Le damos clic:





En la siguiente pantalla dejamos los datos sin modificaciones.

 


Luego damos clic en el link Opciones Avanzadas y las dejamos como se ve en la imagen. Se deben verificar el Id Entrada y el Actz Entrada ya que esos campos son los que utiliza el feedreader para verificar si es una entrada nueva o una entrada ya actualizada, si esos campos no se parametrizan correctamente, cada vez que el feedreader consulte la información, cargará todas las entradas y las duplicará.







Ahora le damos acep y luego Publicar. Lo anterior nos lleva a la pantalla de administración del feed:






Haciendo clic en el link PR_USER, people nos lleva a la ruta donde queda publicado nuestro feed, o sea la ruta que debemos agregar a nuestro Feedreader.




Por último vamos al FeedReader, y abrimos el menú Archivo - Nuevo - Canal, copiamos la ruta y le damos aceptar.


De ahora en adelante el FeedReader nos traerá los usuarios existentes hasta el momento, y cada vez que cambie un usuario o se cree uno nuevo, el FeedReader creará una nueva entrada informándonos.



Unas últimas consideraciones:



Si queremos que solo unos pocos usuarios puedan acceder a este Feed ,en las opciones avanzadas en vez de seleccionar Fuente Pública seleccionamos seguridad de consultas y así, a través de la administración de la seguridad de consultas, la cual puede ser por rol, administraríamos el acceso para que no todos puedan ver esa información.


Por último son necesarias algunas configuraciones a nivel del integration broker para que esto funcione en especial la configuración del usuario en el nodo ANONYMOUS para poder hacer la prueba.


Si desean información adicional sobre el tema o si quieren conocer las habilidades adicionales del Feed Publishing Framework pueden encontrarla en http://download.oracle.com/docs/cd/E18083_01/pt851pbr0/eng/psbooks/tfeed/book.htm.

Bueno acá termina la entrada de esta semana, espero les sea de utilidad. Esperen la próxima semana otras técnicas para generar notificaciones.