Árvore de páginas

Você está vendo a versão antiga da página. Ver a versão atual.

Comparar com o atual Ver Histórico da Página

Versão 1 Próxima »

Índice

 

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".


Atención

Icon

Una gran parte de los eventos cuentan con WKUser para identificar al usuario. Este, al utilizar la función de sustituto, donde un usuario puede remplazar a otro, siempre responderá al usuario que está utilizando el sistema.

Ejemplo: Ana puso Bruno en su reemplazo, Bruno tiene acceso al sistema y realiza una acción en nombre de Ana, el sistema responderá con el código de usuario Bruno en los eventos que utilizan WKUser.

 

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

Ejemplo
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.

Ejemplo
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.

Ejemplo
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.

Ejemplo
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)

Ejemplo
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.

Ejemplo
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.

Ejemplo
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.

Ejemplo
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:

WKDocumentTypeIdID 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

Ejemplo
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.

Ejemplo
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.

Ejemplo
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

Nota

Icon

Los objetos Dto´s se explicarán en el capítulo "Objetos utilizados en los eventos"


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.

Ejemplo
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.

Ejemplo
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.

Ejemplo
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

Nota

Icon

Los objetos Dto´s se explicarán en el capítulo "Objetos utilizados en los eventos"

Ejemplo
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.

 

Ejemplo
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

versionIdVersión del registro de formularioint
cardDataDatos del registro de formularioHashMap < String, String >
Ejemplo
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.

 

Ejemplo
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

Ejemplo
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.

 

Ejemplo
function beforeWatchContent(companyId, watchDTO){
}

 

Los parámetros son:

Propiedad

Descripción

Tipo

companyId

Código de la Empresa

int

watchDTO

Datos del registro

WatchDTO

Ejemplo
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.

 

Ejemplo
function afterWatchContent(companyId, watchDTO){	
}

 

Los parámetros son:

Propiedad

Descripción

Tipo

companyId

Código de la Empresa

int

watchDTO

Datos del registro

WatchDTO

Ejemplo
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.

 

Ejemplo
function beforeUnwatchContent(companyId, watchDTO){
}

 

Los parámetros son:

Propiedad

Descripción

Tipo

companyId

Código de la Empresa

int

watchDTO

Datos del registro

WatchDTO

Ejemplo
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.

 

Ejemplo
function afterUnwatchContent(companyId, watchDTO){
}

 

Los parámetros son:

Propiedad

Descripción

Tipo

companyId

Código de la Empresa

int

watchDTO

Datos del registro

WatchDTO

Ejemplo
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]");
    }
}

Atención

Icon

A partir de la versión 1.3.3 de Fluig, se recomienda validar la plantilla utilizada  plantilla == "TPLDOCUMENT_APPROVAL_PENDINGal revés de la función match(), impidiendo de este modo redundancias en la personalización, ya que el match() puede volverse válido para más de una plantilla en casos tales como TPLNEW_TASK e TPLNEW_TASK_POOL_GROUP.

 

 

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ámetroDescripción
subjectEs 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");
receiversLista 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.
plantillaPermite 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.
paramsEs 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.

 

 

Importante

Icon
  • El evento global onNotify cuenta con bind de variables para el acceso al log, datasetManager, DatasetFactory, DatasetBuilder, ConstraintType y ServiceManager.
  • Se recomienda verificar la lista de parámetros (params) recibida antes de usarlos, ya que estos cambian según la plantilla utilizada.
  • Si un workflow presenta un evento onNotify, este no se tendrá en cuenta en los correos electrónicos del proceso.
  • Es esencial la validación del código de la plantilla antes de cualquier aplicación, dado que TODOS los correos pasarán por esta personalización si el evento está registrado.

 

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

Ejemplo
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

Ejemplo
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

Ejemplo
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

Ejemplo
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.

 

Ejemplo
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.

 

Nota

Icon

Este mapa no tiene objetos cuando el evento es CREAR y BORRAR.

 

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;
    }
Ejemplo
 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;
    }

}
 

imagens dev.png

 

  • Sem rótulos