Índice
- 1 Personalización de Eventos
- 1.1 Eventos Disponibles
- 1.1.1 AddDocumentConvertionExt
- 1.1.2 DisplayCentralTasks
- 1.1.3 DisplayCustomMetadata
- 1.1.4 ValidateCustomMetadata
- 1.1.5 BeforeDocumentPublisher
- 1.1.6 AfterDocumentPublisher
- 1.1.7 BeforeDocumentViewer
- 1.1.8 AfterSaveCard
- 1.1.9 AfterDeleteCard
- 1.1.10 BeforeWatchContent
- 1.1.11 AfterWatchContent
- 1.1.12 BeforeUnwatchContent
- 1.1.13 AfterUnwatchContent
- 1.1.14 OnNotify
- 1.1.15 Objetos utilizados nos eventos
- 1.1.15.1 DocumentDto
- 1.1.15.2 ApproverDto
- 1.1.15.3 DocumentSecurityConfigDto
- 1.1.15.4 RelatedDocumentDto
- 1.1.15.5 WatchDTO
- 1.1 Eventos Disponibles
- 2 Personalización de Eventos JMS
Personalización de Eventos
La personalización de eventos se realiza mediante la creación de secuencias de scripts en lenguaje "JavaScript". El código de aplicación de cada script se almacena en la base de datos y no requiere el uso de otros archivos, como por ejemplo, “custom.p”.
Los eventos de personalización para el Fluig son creados por el administrador, desde el Fluig Studio. Sobre el proyecto Fluig, haga clic en la carpeta eventos y y a a continuación Nuevo - Evento Global Fluig según lo que figura debajo.
Figura 1 - Creación de evento - Fluig Studio.
Luego introduzca el servidor y el nombre del Evento que se agregará. Se abrirá una pantalla para editar el evento, como la siguiente imagen:
Figura 2 - Creación de evento - Fluig Studio.
Es posible observar que el archivo .js se ha agregado a la carpeta eventos del proyecto.
El Fluig permite utilizar el "registro" de ejecución en los eventos de personalización. A través del variable global "registro" es posible obtener la retroalimentación de la ejecución de cada evento. Existen cuatro niveles de registro los mismos son:
- ERROR: presentación de errores.
- DEBUG: ejecución de depuración.
- WARN: informar el posible problema de funcionamiento.
- INFO: presentación de mensajes.
La presentación de cada uno de los tipos de registro está condicionada por la configuración del servidor de aplicación. Por ejemplo, en JBoss ®, de forma predeterminada, los mensajes de tipo info y warn se muestran en la consola del servidor, y las del tipo debug y error se muestran en el archivo de log. A continuación un ejemplo de uso del log en script:
log.info ("probando el log de info");
Aparecería en la consola del servidor el mensaje "Probando el log info".
Eventos Disponibles
A continuación se detallarán los eventos disponibles en Fluig
AddDocumentConvertionExt
Este evento permite personalizar la conversión de documento realizada por Fluig. Puede encontrarse más información sobre este en la guía Convertidores de Documentos.
DisplayCentralTasks
Este evento se acciona siempre antes de mostrarse el centro de tareas. A través de este se puede insertar, cambiar o quitar los enlaces del centro de tareas. El evento recibe como parámetro un LinkedHashMap con los enlaces disponibles en el centro de tareas.
Ejemplo añadiendo un enlace personalizado al final de los artículos del centro de tareas:
function displayCentralTasks (links){ links.put("Fluig","http://www.fluig.com"); }
Ejemplos cambiando el orden de visualización de los enlaces patrones agregando tres nuevos, uno al principio y dos al final:
function displayCentralTasks (links){ var _links = new java.util.LinkedHashMap(); _links.put("Fluig","http://www.fluig.com"); var it = links.keySet().iterator(); while (it.hasNext()) { var key = it.next(); _links.put(key, links.get(key)); } _links.put("Fluig - DEV" ,"http://dev.fluig.com"); _links.put("Google","http://www.google.com.br/search?sourceid=chrome&ie=UTF-8&q=" + getValue("WKUser")); links.clear(); links.putAll(_links); }
Se ponen a disposición algunas informaciones sobre el usuario y la empresa, pero sólo para una consulta por medio del método getValue.
WKUser | Código del usuario |
WKCompany | Número de la empresa |
function displayCentralTasks (links){ log.info("Usuario: “ + getValue("WKUser")); }
DisplayCustomMetadata
Este evento se acciona siempre antes de mostrarse los campos personalizados de un documento, tanto en la publicación como en la edición. Por medio de esta es posible sugerir valores iniciales para campos personalizados de los metadatos de un documento El evento recibe como parámetro una referencia a los campos personalizados.
function displayCustomMetadata(fields){ }
En el marco de este evento la variable campo puede utilizarse para consultar o modificar los valores de los campos personalizados en un documento. No permite agregar nuevos campos.
Para insertar nuevos campos en un documento, hay varias formas disponibles.
- Por herencia de la carpeta principal.
- En el registro Campos Personalizados, al seleccionar la opción Mostrar en todos los documentos o de la forma estándar.
- A través del WebService CustomFieldsService.
- En la edición de los metadatos del documento, por parte del usuario.
Para consultar el valor de un campo personalizado en este evento, se utiliza el campo getValue incluyendo como parámetro el código del campo deseado. Volviendo a "null", en el caso de que el campo no esté disponible para este documento.
function displayCustomMetadata(fields){ log.info("Valor del Campo 1: “ + fields.getValue("campo1")); }
Ya para la edición se utiliza el fields.setValue, incluyendo como parámetro, primero el nombre del campo, a continuación el valor.
function displayCustomMetadata(fields){ fields.setValue("campo1","Valor para el Campo 1"); }
Además de los valores de los campos personalizados ponemos a disposición algunas informaciones del documento que se crea o edita, pero solamente para consulta mediante el método getValue.
WKUser | Código del usuario |
WKCompany | Número de la empresa |
WKNumParentDocument | Número de la carpeta principal |
WKDocumentType | Tipo de Documento: |
WKPrivateDocument | Si el documento se publica en la carpeta particular (verdadero/falso) |
function displayCustomMetadata(fields){ log.info("Usuario: “ + getValue("WKUser")); }
ValidateCustomMetadata
Este evento se acciona siempre antes de guardar los valores de los campos personalizados de un documento, tanto en la publicación como en la edición. Por medio de esta es posible modificar o aceptar los valores de los campos personalizados de los metadatos de un documento. El evento recibe como parámetro una referencia a los campos personalizados.
function validateCustomMetadata(campos){ }
En el marco de este evento la variable campo puede utilizarse para consultar o modificar los valores de los campos personalizados en un documento. No permite agregar nuevos campos.
Para ingresar nuevos campos en un documento hay varias formas disponibles.
- Por herencia de la carpeta principal.
- En el registro Campos Personalizados, al seleccionar la opción Mostrar en todos los documentos o de la forma estándar.
- A través del WebService CustomFieldsService.
- En la edición de los metadatos del documento, por parte del usuario.
Para consultar el valor de un campo personalizado en este evento, se utiliza el campo getValue incluyendo como parámetro el código del campo deseado. Volviendo a "null", en el caso de que el campo no esté disponible para este documento.
function validateCustomMetadata (fields){ log.info("Valor del Campo 1: “ + fields.getValue("campo1")); }
Ya para la edición se utiliza el fields.setValue, incluyendo como parámetro, primero el nombre del campo, a continuación el valor.
function validateCustomMetadata (fields){ fields.setValue("campo1","Valor para el Campo 1"); }
Además de los valores de los campos personalizados se pone a disposición algunas informaciones del documento que se crea o edita, pero solamente para consulta a través del método getValue.
WKUser | Código del usuario |
WKCompany | Número de la empresa |
WKNumParentDocument | Número de la carpeta principal |
WKDocumentType | Tipo de Documento: |
WKDocumentTypeId | ID del tipo de documento |
WKPrivateDocument | Si el documento se publica en la carpeta particular (verdadero/falso) |
WKNumAcess | Número de accesos |
WKComments | Comentarios del documento |
WKAuthor | Código del autor del documento. |
WKCreateDate | Fecha de creación del documento |
WKDescription | Descripción del documento |
WKNumDocument | Número del documento |
WKNumVersion | Número de versión del documento |
WKExpirationDate | Fecha de vencimiento del documento |
WKExpires | ¿Documento expira? (verdadero/falso) |
WKFileSize | Tamaño en bytes del documento |
WKKeyWord | Palabras clave del documento |
WKVolume | Número del documento |
WKSubject | Tema relacionado con el documento |
function validateCustomMetadata (fields){ log.info ("usuario:" + getValue ("WKUser")); }
Las excepciones pueden ser manejadas usando el comando throw.
Este comando devuelve un mensaje al usuario cuando intenta guardar el documento.
function validateCustomMetadata (fields){ if( fields.getValue("campo1") == “Área 1”){ throw "TRATAMIENTO DE EXCEPCIÓN"; } }
BeforeDocumentPublisher
Se utiliza cuando es necesario realizar la validación personalizada en las propiedades de publicación/edición de documentos antes de guardar en la base de datos. Entre todas las propiedades de la pantalla de publicación/edición de documentos no se tratarán los campos personalizados , ya que hay un evento que maneja esta situación.
BeforeDocumentPublisher }
Están disponibles algunas propiedades del documento que se está creando o editado, pero sólo para consulta a través del método getValue.
Propiedad | Descripción | Tipo |
WKDocument | Objeto del documento | DocumentDto |
WKSubject | Descripción del asunto del documento | String |
WKListApprover | Lista de aprobadores del documento | List<ApproverDto> |
WKListSecurity | Lista con seguridad del documento | List <DocumentSecurityConfigDto> |
WKListRelatedDocument | Lista de documentos relacionados con el documento | Lista de < RelatedDocumentDto > |
WKState | Estado de acción: PUBLISH o MODIFY | String |
WKUser | Usuario conectado | String |
WKCompany | Código de la Empresa | int |
El producto se vuelve a nullcuando es necesario recoger algunas de las propiedades del documento que no existen.
Por ejemplo: No todos los documentos publicados tienen aprobador, entonces la variable WKListApprover sólo traerá información cuando realmente haya aprobadores en la publicación.
function beforeDocumentPublisher(){ var doc = getValue ("WKDocument"); var objeto = getValue ("WKSubject"); var listApprover = getValue("WKListApprover"); var listSeg = getValue("WKListSecurity"); var listRelated = getValue("WKListRelatedDocument"); var state = getValue("WKState"); var user = getValue("WKUser"); var company = getValue("WKCompany"); log.info ("usuario:" + user); log.info ("empresa:" + empresa); log.info("Número de documento: "+ doc.getDocumentId() + " - Versión: "+ doc.getVersion()); if(listApprover!=null){ for(j = 0; j < listApprover.size(); j++) { if (listApprover.get(j).getColleagueId().equals("adm")){ throw "el usuario adm puede ser aprobador de documento"; } } } if(listSeg != null){ for(j = 0; j < listSeg.size(); j++) { if (listSeg.get(j).getAttributionValue().equals("cvd")){ throw "el cvd de usuario no puede estar en la seguridad de documentos"; } } } if( listRelated != null){ log.info ("los siguientes documentos están relacionados a este documento:"); for(j = 0; j < listRelated.size(); j++) { log.info("Nr. documento: "+ listRelated.get(j).getRelatedDocumentId()); } } log.info("Tema: " + subject); log.info ("Estado:" + state); }
AfterDocumentPublisher
Se utiliza cuando es necesario realizar algún modificación personalizada en las propiedades de la pantalla de publicación/edición de documentos después de que el mismo se guarda en la base de datos. Entre todas las propiedades de la pantalla de publicación/edición de documentos no se tratarán los campos personalizados.
function afterDocumentPublisher(){ }
Las propiedades recuperadas por medio del método GetValue() son las mismas de eventos beforeDocumentPublisher y la forma de manipulación de las propiedades puede verse en el ejemplo del evento beforeDocumentPublisher.
BeforeDocumentViewer
Utilizado cuando es necesario hacer una validación personalizada antes de ver cualquier documento.
BeforeDocumentViewer }
Están disponibles algunas propiedades del documento que se está visualizando, pero sólo para consulta a través del método getValue.
Propiedad | Descripción | Tipo |
WKDocument | Objeto del documento | DocumentDto |
WKUser | Usuario regisrado | String |
WKCompany | Código de la Empresa | int |
function beforeDocumentViewer(){ var doc = getValue ("WKDocument"); var company = getValue("WKCompany"); var ds try { var c1 = DatasetFactory.createConstraint( "allocatedDocumentPK.companyId", company, company, ConstraintType.MUST); var c2 = DatasetFactory.createConstraint( "allocatedDocumentPK.sourceDocument", doc.getDocumentId(), doc.getDocumentId(), ConstraintType.MUST); var c3 = DatasetFactory.createConstraint( "allocatedDocumentPK.sourceVersion", doc.getVersion(), doc.getVersion(), ConstraintType.MUST); var c4 = DatasetFactory.createConstraint("active", "true","true", ConstraintType.MUST); var constraints = new Array(c1, c2, c3, c4); ds = DatasetFactory.getDataset("allocatedDocument", null, constraints, null); } catch (e) {} log.error("Errro al intentar recuperar el documento en CheckOut: " + e.message); } If (ds! = null & & ds. rowsCount > 0) {} throw "Este documento está en check out y no puede visualizarse. El documento ha sido generado "+ ds. getValue (0,"allocatedDocumentPK. destinationDocument") +" que está bajo la responsabilidad del usuario registrado "+ ds. getValue (0,"colleagueId"); } }
AfterSaveCard
Utilizado al crear/guardar los datos de un registro de formulario para la Navegación de Documentos o por flujo de Workflow si desea guardar los datos del registro del formulario en una forma externa. Por ejemplo, al crear el registro de formularios, envíe los datos a un Webservice de otro producto.
la función afterSaveCard (companyId, formId, cardId, versionId, cardData){ }
Los parámetros son:
Propiedad | Descripción | Tipo |
companyId | Código de la Empresa | int |
formId | Campos del formulario | int |
cardId | Código de registro de formulario | int |
versionId | Versión del registro de formulario | int |
cardData | Datos del registro de formulario | HashMap < String, String > |
function afterSaveCard(companyId, formId, cardId, versionId, cardData){ var custom = ServiceManager.getService("CustomCard"); var serviceHelper = custom.getBean(); var serviceLocator = serviceHelper. instanciar ("com. totvs .technology. webdesk. formas .service. custom. CustomCardServiceLocator"); var service = serviceLocator.getCustomCardPort(); var ar = new Array(); var it = cardData.keySet().iterator(); while (it.hasNext()) { var key = it.next(); var field1 = serviceHelper.instantiate("com.totvs.technology.webdesk.forms.service.custom.CardKeyValue"); Campo1. setKey (llave); field1.setValue( cardData.get(key)); log.info('>' + key + ': ' + cardData.get(key)); ar.push(field1); } var resultArr = serviceHelper.instantiate("com.totvs.technology.webdesk.forms.service.custom.CardKeyValueArray"); resultArr.setItem(ar); service.create(companyId, formId, cardId, versionId, resultArr); }
AfterDeleteCard
Utilizado como un suplemento para el evento afterSaveCard. Se utiliza todas las veces que un formulario o registro de formulario se elimina de la papelera de reciclaje.
function afterSaveCard(companyId, formId, cardId, versionId, cardData){ }
Los parámetros son:
Propiedad | Descripción | Tipo |
companyId | Código de la Empresa | int |
cardId | Código de registro de formulario | int |
function afterDeleteCard(companyId,cardId){ var custom = ServiceManager.getService("CustomCard"); var serviceHelper = custom.getBean(); var serviceLocator = serviceHelper. instanciar ("com. totvs .technology. webdesk. formas .service. custom. CustomCardServiceLocator"); var service = serviceLocator.getCustomCardPort(); log.info("########## cargó servicio CustomCard"); Service deleteCard (IdEmpresa, cardId); }
BeforeWatchContent
Se utiliza para seguir algunos contenidos si desea recuperar la información del registro y utilizarla antes de la acción de "seguir". Por ejemplo, para acompañar un documento, es posible recuperar su información y usarla en un conjunto de datos.
function beforeWatchContent(companyId, watchDTO){ }
Los parámetros son:
Propiedad | Descripción | Tipo |
companyId | Código de la Empresa | int |
watchDTO | Datos del registro | WatchDTO |
function beforeWatchContent(companyId, watchDTO){ if(watchDTO.getSocialWatchType() == "DOCUMENT"){ var objClass = "com.totvs.technology.social.document.6"; var objClass = watchDTO.getObjectClass(); var patt = new RegExp( /\d+/) ; var documentId = patt.exec(objClass) ; var documentVersion = watchDTO.getObjectId(); var doc = getValue ("WKDocument"); var company = companyId; var ds ; try { var c1 = DatasetFactory.createConstraint( "allocatedDocumentPK.companyId", company, company, ConstraintType.MUST); var c1 = DatasetFactory.createConstraint( "allocatedDocumentPK.companyId", company, company, ConstraintType.MUST); var c3 = DatasetFactory.createConstraint("allocatedDocumentPK.sourceVersion", documentVersion,documentVersion, ConstraintType.MUST); var c4 = DatasetFactory.createConstraint("active", "true","true",ConstraintType.MUST); var constraints = new Array(c1, c2, c3, c4); ds = DatasetFactory.getDataset("allocatedDocument", null, constraints, null); } catch (e) {} log.error("Errro al intentar recuperar el documento en CheckOut: " + e.message); } If (ds! = null & & ds. rowsCount > 0) {} throw "Su solicitud de notificación ha sido denegada, ya que el documento está en checkout." ; } } }
AfterWatchContent
Se utiliza para seguir algún contenido si desea recuperar informaciones del registro y usar después la acción de "seguir". Por ejemplo, al seguir un post, es posible recuperar sus informaciones y utilizarlas para informar al usuario sobre el autor del post.
function afterWatchContent(companyId, watchDTO){ }
Los parámetros son:
Propiedad | Descripción | Tipo |
companyId | Código de la Empresa | int |
watchDTO | Datos del registro | WatchDTO |
function afterWatchContent(companyId, watchDTO){ if(watchDTO.getSocialWatchType() == "POST"){ throw "El usuario "+watchDTO.getUserAlias()+" será notificado sobre el post " + watchDTO.getText() + " del autor " + watchDTO.getPostAuthor() ; } }
BeforeUnwatchContent
Se utiliza al dejar de seguir algún contenido si desea recuperar informaciones del registro y utilizarlas antes de la acción "dejar de seguir". Por ejemplo, al intentar dejar de seguir a una comunidad, existe la posibilidad de decidir si el usuario puede dejar de seguirla.
function beforeUnwatchContent(companyId, watchDTO){ }
Los parámetros son:
Propiedad | Descripción | Tipo |
companyId | Código de la Empresa | int |
watchDTO | Datos del registro | WatchDTO |
function beforeUnwatchContent(companyId, watchDTO){ if(watchDTO.getSocialWatchType() == "COMMUNITY"){ throw "Usted no puede dejar de ser notificado sobre la comunidad" + watchDTO.getDescription() ; } }
AfterUnwatchContent
Se utiliza al dejar de seguir algún tipo de contenido si desea recuperar informaciones del registro y utilizar después la acción "dejar de acompañar". Por ejemplo, al dejar de seguir una publicación se hace posible recuperar sus informaciones e informar al usuario que este post cuenta con muchos seguidores.
function afterUnwatchContent(companyId, watchDTO){ }
Los parámetros son:
Propiedad | Descripción | Tipo |
companyId | Código de la Empresa | int |
watchDTO | Datos del registro | WatchDTO |
function afterUnwatchContent(companyId, watchDTO){ if(watchDTO.getSocialWatchType() == "POST" && watchDTO.getNumberWatchers() < 3 ){ log.equivocado("El post \"" + watchDTO.getText() + "\" del autor " + watchDTO.getPostAuthor() + " ya no es polémico" ) } }
OnNotify
Para interferir en un correo patrón de Fluig se debe utilizar el evento global onNotify, que se dispara al momento en que alguno de los correos de Fluig se envía. En este evento, se pueden realizar modificaciones como, por ejemplo, agregar otros destinatarios al correo, cambiar los valores de los parámetros usados en la plantilla del correo electrónico, etc.
A continuación se encuentra un ejemplo de cómo poner en funcionamiento este evento:
function onNotify(subject, receivers, template, params) { if (template.match("TPLDOCUMENT_APPROVAL_PENDING") != null) { receivers.add("[email protected]"); } }
El evento onNotify se encuentra disponible en la lista de eventos globales. Al seleccionar este evento en la lista de eventos disponibles, la firma de la función superior se completará automáticamente. Este evento pone a disposición los siguientes parámetros:
Parámetro | Descripción |
---|---|
subject | Es el asunto del correo electrónico. La modificación de esta variable implicará que todos los usuarios reciban el correo electrónico con un nuevo asunto configurado. Ejemplo de utilización: subject.add("ASUNTO"); |
receivers | Lista de correos electrónicos destinatarios. Además se puede agregar otros correos electrónicos de usuarios que no forman parte del proceso. Incluso se puede agregar correos electrónicos de usuarios que no se registraron en Fluig, en el caso de que sea necesario notificar a una persona que no tenga acceso al sistema. |
plantilla | Permite validar qué tipo de correo electrónico se enviará (por ejemplo, plantilla de documento en aprobación, documento expirado, etc). En base a esta variable podremos diferenciar qué correos electrónicos queremos personalizar. Se recomienda que siempre se verifique el código de la plantilla, a fin de evitar que sucedan cambios en otros tipos de correos electrónicos, que no necesitan personalizarse. |
params | Es un mapa de datos que posibilita alterar/incluir parámetros para que se presenten en el correo electrónico. El nombre de los parámetros informados en este mapa deben ser los mismos que se utilizan dentro del archivo de la plantilla. |
En el ejemplo que se presentó anteriormente está validándose la plantilla "TPLDOCUMENT_APPROVAL_PENDING" (que corresponde al documento pendiente de aprobación). En el caso de que sea positivo, un nuevo correo se agregará en la lista de destinatarios. Es decir, además del responsable de la aprobación, se notificará a otra persona, recibiendo una copia del correo electrónico. Como está validándose el código de la plantilla, no se afectarán los demás tipos de correos
Las plantillas pueden consultarse dentro del directorio del volumen, en: <VOLUME>\templates\tplmail. En el caso de que sea necesario agregar algún parámetro en el correo electrónico patrón, las plantillas pueden editarse directamente dentro de este directorio.
Objetos utilizados en los eventos
Hay algunos objetos puestos a disposición por el producto que se utilizan en los eventos, en las próximas sesiones se explicarán sus métodos y sus respuestas.
DocumentDto
Este objeto representa el documento y sus propiedades; la siguiente tabla consta de más información al respecto:
Función | Descripción de la Función | Tipo de Respuesta |
(getDocumentId) | Responde con el número del documento. | int |
getVersion() | Responde con el número de la versión documento. | int |
getCompanyId() | Responde con el código de la empresa en la que el documento ha sido publicado. | Int |
(getUUID) | Responde con el UUID (identificador único Global) del documento. | String |
getDocumentTypeId() | Responde con el tipo del archivo físico, si regreso blanco o nulo es porque este tipo no es conocido por Fluig. | String |
(getLanguageId) | Responde con el código de idioma del documento. | String |
getIconId() | Responde con el código del ícono del documento. | int |
getTopicId() | Responde con el asunto del documento | int |
getColleagueId() | Responde con la matrícula del usuario que creó el documento. | String |
getDocumentDescription() | Responde con la descripción del documento. | String |
getAdditionalComments() | Responde con los comentarios adicionales del documento. | String |
getPhisicalFile() | Responde con la ruta física donde se guarda el documento | String |
getCreateDate() | Responde con la fecha de creación. | java.util.Date |
(getApprovedDate) | Responde con la fecha de Aprobación | java.util.Date |
getLastModifiedDate() | Responde con la fecha de la última modificación. | java.util.Date |
getDocumentType() | Responde con el tipo del documento, donde: 0 a la carpeta raíz 1 a la Carpeta 2 al Documento normal 3 al Documento externo 4 al Fichero 5 a la Ficha 7 al Anexo Workflow 8 al Nuevo Contenido 10 a la Aplicación 11 al Informe portal al Sitio web Página portal al Sitio web | String |
getExpirationDate() | Responde con la fecha de vencimiento. | java.util.Date |
getParentDocumentId() | Responde con el número de la Carpeta/Fichero raiz | int |
getRelatedFiles() | String con el nombre del archivo físico principal y los adjuntos. | String |
getActiveVersion() | Responde si la versión es activa. | Boolean |
getVersionDescription() | Responde con la descripción de la versión. | String |
getDownloadEnabled() | Responde si el documento permite la descarga | Boolean |
getApproved() | Responde si el documento se encuentra en aprobación. | Boolean |
getValidationStartDate() | Responde a partir de qué fecha podrá visualizarse el documento. | java.util.Date |
getPublisherId() | Responde con la matrícula del usuario que publicó el documento. | String |
getCardDescription() | Responde con la descripción de la ficha para el documento del tipo 5. | String |
getDocumentPropertyNumber() | Responde con el fichero que se utilizó como base para la creación de la ficha, a causa de esto sólo tiene valor si el documento es del tipo 5 (ficha). | int |
getDocumentPropertyVersion() | Responde con la versión del fichero en la que la ficha ha sido creada. | int |
getPrivateDocument() | Responde si el documento/carpeta se sigue de una carpeta particular. | Boolean |
getPrivateColleagueId() | Si se trata de un documento particular responde con la matrícula de usuario donde se ubica este documento. | String |
getIndexed() | Responde si el documento ya ha sido indexado. | Boolean |
getPriority() | Responde con la prioridad del documento. | int |
getUserNotify() | Responde si notifica a los usuarios que tengan este tema de interés. | Boolean |
getExpires() | Responde si el documento está vencido. | Boolean |
getVolumeId() | Responde con el volumen donde el documento ha sido publicado, si se encontrara en blanco este utiliza el volumen principal. | String |
getInheritSecurity() | Responde si hereda seguridad de principal. | Boolean |
getUpdateIsoProperties() | Responde si actualiza las propiedades de la copia controlada. | Boolean |
getLastModifiedTime() | Responde con la hora última modificación en milisegundos. | String |
getDeleted() | Responde si el documento está en la papelera de reciclaje. | Boolean |
getDatasetName() | Responde con el documento del dataset, si el documento es una fichero. | String |
getKeyWord() | Responde con las palabras claves del documento. Cada palabra está separada por una coma. | String |
getImutable() | Responde si la versión/revisión es inmutable. | Boolean |
getDraft() | Responde si el documento se encuentra en edición, para un documento de tipo "Nuevo contenido". | Boolean |
getInternalVisualizer() | Responde si utiliza un visualizador interno. | Boolean |
getPhisicalFileSize() | Responde con el tamaño físico del documento principal y los adjuntos. | float |
var doc = getValue ("WKDocument"); log.info("Número de documento: "+ doc.getDocumentId() + " - Versión: "+ doc.getVersion());
ApproverDto
Este objeto representa a los aprobadores y sus propiedades; en la siguiente tabla consta de mayor información al respecto:
Función | Descripción de la Función | Tipo de Respuesta |
(getDocumentId) | Responde con el número del documento. | int |
getVersion() | Responde con el número de la versión documento. | int |
getCompanyId() | Responde con el código de la empresa en la que el documento ha sido publicado. | Int |
getColleagueId() | Responde con la matrícula de un usuario o código de grupo que se encuentra aprobando este documento. Es posible saber si responderá a un usuario o un grupo según el tipo de aprobación. | String |
getApproverType() | Devuelve el tipo de aprobación, donde: 0 al Usuario 1 al Grupo | int |
getLevelId() | Responde con el nivel de aprobación, en el caso de aprobación en niveles. | int |
var listApprover = getValue("WKListApprover"); if(listApprover!=null){ for(j = 0; j < listApprover.size(); j++) { if (listApprover.get(j).getColleagueId().equals("adm")){ throw "el usuario adm no puede ser aprobador de documentos"; } } }
DocumentSecurityConfigDto
Este objeto representa la seguridad de un documento y sus propiedades, en la siguiente tabla hay más información sobre esto:
Función | Descripción de la Función | Tipo de Respuesta |
(getDocumentId) | Responde con el número del documento. | int |
getVersion() | Responde con el número de la versión documento. | int |
getCompanyId() | Responde con el código de la empresa en la que el documento ha sido publicado. | Int |
getAttributionValue() | Responde con la matrícula de un usuario o código de grupo que está a su vez aprobando este documento. Es posible saber si responderá a un usuario o un grupo según el tipo de seguridad. Obs.: Responde con en blanco respecto al tipo es todos los usuarios. | String |
getAttributionType() | Responde el tipo de seguridad, donde: 1 al Usuario; 2 al Grupo; 3 a Todos los usuarios. | int |
getPermission() | Responde si es un permiso. Obs.: Si no es un permiso es una restricción. | Boolean |
getShowContent() | Responde si pone en lista el contenido. | Boolean |
getSecurityLevel() | Responde al nivel de permiso/restricción, donde: -1 a sin permiso/restricción (negar el acceso); 0 a Lectura; 1 a Grabación; 2 a Modificación; 3 al Total. | int |
getSequence() | Respondecon la cadena de permiso/restricción. | int |
getSecurityVersion() | Responde si este utiliza la seguridad de esta versión en las otras. | Boolean |
var listSeg = getValue("WKListSecurity"); if(listSeg != null){ for(j = 0; j < listSeg.size(); j++) { if (listSeg.get(j).getAttributionValue().equals("cvd")){ throw "el cvd de usuario no puede estar en la seguridad de documentos"; } } }
RelatedDocumentDto
Este objeto representa los documentos relacionados y sus propiedades; en la siguiente tabla consta de más informaciones al respecto:
Función | Descripción de la Función | Tipo de Respuesta |
(getDocumentId) | Responde con el número del documento. | int |
getVersion() | Responde con el número de la versión documento. | int |
getCompanyId() | Responde con el código de la empresa en la que el documento ha sido publicado. | int |
getRelatedDocumentId() | Responde con el número del documento que está relacionado al documento publicado. | int |
var listRelated = getValue("WKListRelatedDocument"); if( listRelated != null){ log.info ("los siguientes documentos están relacionados a este documento:"); for(j = 0; j < listRelated.size(); j++) { log.info("Nr. documento: "+ listRelated.get(j).getRelatedDocumentId()); } }
WatchDTO
Este objeto representa las notificaciones de seguimiento de comentarios y sus propiedades, en la siguiente tabla se encuentran más información sobre esto:
Función | Descripción de la Función | Tipo de Respuesta |
getEntityId() | Responde con el código del contenido. | String |
getUserId() | Responde con el código del usuario. | String |
getUserAlias() | Responde con el apodo del usuario. | String |
getSociableId() | Responde con el código sociable. | String |
getCreationDate() | Responde con la fecha de creación. | String |
getLastUpdateDate() | Responde con la fecha de la última actualización. | String |
getNumberComments() | Responde con el número de comentarios. | String |
getNumberLikes() | Responde con el número de apoyos. | String |
getNumberShares() | Responde con el número de elementos compartidos. | String |
getNumberWatchers() | Responde con el número de elementos seguidos. | String |
getNumberDenouncements() | Responde con el número de denuncias. | String |
getSocialWatchType() | Responde con el tipo (social) | String |
getPostAuthor() | Responde con el autor del contenido. | String |
getTags() | Responde con las etiquetas. | String |
getText() | Responde con el texto. | String |
getDescription() | Responde con la descripción. | String |
getObjectClass() | Responde con la clase del objeto. | String |
getObjectId() | Responde con el objectId. | String |
getThumbURL() | Responde con la dirección url del thumb | String |
Personalización de Eventos JMS
El Fluig cuenta con personalización evento JMS, lo que permite crear procedimientos de auditoría basados en informaciones suministradas por el producto. El JMS (Java Message Service) es una API de Java ™ que proporciona una conexión asincrónica entre aplicaciones a través de mensajería.
El producto plantea dos tipos de mensajes JMS personalizables, la wdkDocument y el wdkAbstract.
El wdkDocument se activará cuando haya manipulación en los documentos Fluig, para que la aplicación reciba el mensaje con la información del documento la clase tiene que extender el MessageListener y la siguiente línea:
@MessageDriven (mappedName = "custom/DocumentListener", activationConfig = {} @ActivationConfigProperty (propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty (propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
El objeto responderá con un MapMessage que contendrá los siguientes parámetros:
- event (String): Informa cuál es el tipo de evento que se realizó con el documento, como se muestra en la siguiente tabla:
Evento | Descripción |
PUBLICAR | Nuevo documento publicado. |
MODIFICAR | Documento modificado |
BORRAR | Documento se elimina de la base de datos. |
SENDRECYCLE | Documento se envía a la papelera. |
DELETEFOLDER | Se elimina una carpeta de la base de datos. |
EXTERNALCONVERTION | Documento con conversión personalizada. |
CONVERTIONLONGTERM | Documento convertido a largo plazo. |
SE MUEVE | Uno o más documentos o carpetas han sido trasladadas de una carpeta a otra. |
RESTORERECYCLE | Restaurar carpetas y documentos de la papelera de reciclaje. |
- companyId (Integer): Código de la empresa en la que el documento ha sido publicado.
- colleagueId (String): Usuario que realizó la acción.
- documentId (entero): Código del documento que donde ocurrió la acción.
- versión (Integer): Número de versión del documento
- lhasCreatedDocument (Boolean): Informa si creó el documento.
- IhasIncreasedVersion (Boolean): Informa si se ha incrementado la versión.
- changedApproval (Boolean): Informa si se ha modificado el aprobador.
- documento (byte[ ]): Matriz de bytes con el documento y sus propiedades.
import java.util.Enumeration; Import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.MapMessage; import javax.jms.Message; import javax.jms.MessageListener; @MessageDriven (mappedName = "custom/DocumentListener", activationConfig = {} @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/wdkDocument") }) public class TxtMessageBean implements MessageListener {} @Override public void onMessage(Message message) { try { System.out.println ("== == == == documento oyente === ==="); System.out.println("Message received: " + message.getJMSMessageID()); if (message instanceof MapMessage) { MapMessage mm = (MapMessage) message; @SuppressWarnings("unchecked") Enumeration<String> es = mm.getMapNames(); while (es.hasMoreElements()) { String prop = es.nextElement(); System.out.println(prop + ": " + mm.getObject(prop)); } } System.out.println("========Fim Document Listener========"); } catch (Exception e) { e.printStackTrace(); } } }
El wdkAbstract se activa cuando hay manipulación en algunos objetos en el Fluig, según la siguiente tabla:
Objeto | Descripción | Tabla en BD |
Icon | Ícono | ÍCONO |
Topic | Asunto | ASUNTO |
Shortcut | Seguridad del menú | MENU_ICONE |
LogAccess | URL de acceso. | LOG_ACCESS |
ColleagueReplacement | Sustituto | COLAB_SUBSTTO |
Application | Aplicación | APLICACIÓN |
ProgressLib | Ambiente de progreso | AMBIEN_PROGRESS |
GlobalCalendar | Feriado | CALEND_GLOBAL |
Term | Término | TÉRMINO |
Synonym | Sinónimo | SINÓNIMO |
DocumentType | Tipo de Documento | TIPO_DOCUMENTO |
Volumen | Volumen | VOL_FISIC |
AttributionMecanism | Mecanismo de atribución | MECAN_ATRIBUIC |
EmailTemplate | Plantilla de Correo | TEMPLATE_EMAIL |
CustomizedDatasetBuilder | Dataset | SERV_DATASET |
DataService | Servicios | SERV_DATOS |
CustomFields | Campos personalizados. | CAMPO_CUSTOM |
UserGraphicSetings | Dashboard | CONFIGUR_GRAF_USUAR |
Watermark | Marca de agua. | MARCA_DE _AGUA |
WebLayout | Layout. | WEBLAYOUT |
Adapter | Adaptadores | ADAPTER |
Para que la aplicación reciba el mensaje con las informaciones de estos objetos la clase tiene que prolongar el MessageListener y contar con la siguiente línea:
@MessageDriven (mappedName = "custom/DocumentListener", activationConfig = {} @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/wdkAbstract")})
El objeto responderá con un MapMessage que contendrá los siguientes parámetros:
- event (String): Infroma cuál o qué tipo de evento se realizó con el objeto, como se muestra en la siguiente tabla:
Evento | Descripción |
CREATE | Se crea un nuevo objeto. |
UPDATE | Se ha modificado un objeto |
DELETE | Un objeto ha sido eliminado de la base de datos. |
- userId (String): Usuario que realizó la acción.
- entidad (String): Entidad del objeto que está manipulándose, según la tabla que ha sido mostrada anteriormente.
- mapNewVersion (byte []): Matriz de bytes de un HashMap < String, Object > con la propiedad del objeto.
- mapPreviousVersion (byte[ ]): Matriz de bytes de un HashMap < String, Object > con las propiedades del objeto antes del cambio.
Para transformar la Matriz de bytes recibidos en el mensaje en un HashMap sólo utilice la siguiente función:
private Map<String, Object> decoderMap(byte[] array) { if(array.length>0){ ByteArrayInputStream bos = new ByteArrayInputStream(array); ObjectInputStream p = new ObjectInputStream(bos); Object docObject = p.readObject(); try{ Map<String, Object> map = (Map<String, Object>) docObject; return map; }catch(java.lang.ClassCastException e){ e.printStackTrace(); } } return null; }
package com.totvs.fluig.custom.dm; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.util.Enumeration; import java.util.Iterator; import java.util.Map; Import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.MapMessage; import javax.jms.Message; import javax.jms.MessageListener; @MessageDriven (mappedName = "custom/DocumentListener", activationConfig = {} @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/wdkAbstract") }) public class AbstractListenerMessageBean implements MessageListener { @Override public void onMessage(Message message) { try { System.out.println("==============Abstract Listener===================="); System.out.println("Message received: " + message.getJMSMessageID()); if (message instanceof MapMessage) { MapMessage mm = (MapMessage) message; @SuppressWarnings("unchecked") Enumeration<String> es = mm.getMapNames(); while (es.hasMoreElements()) { String prop = es.nextElement(); System.out.println(prop + ": " + mm.getObject(prop)); if(prop.equalsIgnoreCase("mapNewVersion") || prop.equalsIgnoreCase("mapOldVersion")){ Map<String, Object> m = decoderMap(mm.getBytes(prop)); Iterator it = m.entrySet().iterator(); while (it.hasNext()) { Map.Entry e = (Map.Entry)it.next(); System.out.println(prop + " - " + e.getKey() + ": " + e.getValue()); } } } } System.out.println("==========Fim Abstract Listener==============="); } catch (Exception e) { e.printStackTrace(); } } private Map<String, Object> decoderMap(byte[] array) throws IOException, ClassNotFoundException{ if(array.length>0){ ByteArrayInputStream bos = new ByteArrayInputStream(array); ObjectInputStream p = new ObjectInputStream(bos); Object docObject = p.readObject(); try{ Map<String, Object> map = (Map<String, Object>) docObject; return map; }catch(java.lang.ClassCastException e){ e.printStackTrace(); } } return null; } }