Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
Comentário: Liberar apenas após a tarefa: https://jiraproducao.totvs.com.br/browse/FBPM-7942

...

Este guia é destinado aos desenvolvedores internos e externos do fluig TOTVS Fluig Plataforma que desejam manipular os eventos de documentos. O objetivo é apresentar o seu funcionamento e a descrição dos campos utilizados.

...

Este evento permite personalizar a conversão de documento realizada pelo fluigTOTVS Fluig Plataforma. Mais informações sobre ele podem ser encontradas no guia Conversores de Documentos.

...

ValidateUpload

Nota

A partir da versão: 1.8.1- Silver Mist

Este evento sempre é disparado antes de salvar os valores dos campos customizados de um documento, tanto na publicação como ediçãorealizar upload de arquivo para a plataforma, seja por API Rest, Soap/Webservices ou FTP. Através dele é possível alterar ou validar os valores dos campos customizados dos metadados de um documentovalidar o MIMEType ou Extensão do arquivo que está sendo feito upload e poder bloquear. O evento recebe como parâmetro uma referência aos campos customizadosnão recebe parâmetros, porém temos acesso à função getValue.

Exemplo:

Bloco de código
languagejs
linenumberstrue
function validateCustomMetadatavalidateUpload(fields){
}

No contexto deste evento a variável fields pode ser usada para consultar ou modificar os valores dos campos customizados de um documento. Não permitindo adicionar novos campos.
Para inserir novos campos em um documento existe varias maneiras disponíveis.

  • Pela herança da pasta pai.
  • No cadastro de Campos Customizados, marcando a opção Mostrar em todos documentos ou da forma padrão.
  • Através do WebService CustomFieldsService.
  • Na edição dos metadados do documento, pelo usuário.

Para consultar o valor de um campo customizado neste evento, utiliza-se o fields.getValue passando como parâmetro o código do campo desejado. Retornando null, caso o campo não esteja disponível para este documento.

Exemplo:

Bloco de código
languagejs
linenumberstrue
function validateCustomMetadata (fields){
    log.info("Valor do Campo 1: " + fields.getValue("campo1"));
}

Já para realizar a edição utiliza-se o fields.setValue, passando como parâmetro, primeiro o nome do campo, em seguida o valor.

Exemplo:

Bloco de código
languagejs
linenumberstrue
function validateCustomMetadata (fields){
    fields.setValue("campo1","Valor para o Campo 1");
}

Alem dos valores dos campos customizados disponibilizamos algumas informações do documento que está sendo criado ou editado, porém somente para consulta através do método getValue.

...

WKDocumentType

...

ID do tipo de documento

...

Número de acessos

...

Palavras chaves do documento

...

Informações

Veja o exemplo em nosso repositório aqui.

Exemplo:

Bloco de código
languagejs
linenumberstrue
function validateCustomMetadata (fields){
    log.info("Usuário: " + getValue("WKUser "));
}

As exceções podem ser tratadas utilizando o comando throw. Este comando retornará uma mensagem ao usuário ao tentar salvar o documento.

Exemplo:

Bloco de código
languagejs
linenumberstrue
function validateCustomMetadata (fields){
    if( fields.getValue("campo1") == "Area 1"){
        throw "TRATAMENTO DA EXCEÇÃO";
    }
}

BeforeDocumentPublisher

Utilizado quando é preciso fazer validação customizada nas propriedades da tela de publicação/edição de documentos antes de salva-lo no banco de dados. Dentre todas as propriedades da tela de publicação/edição de documentos não serão tratados os campos customizados, pois já existe um evento que trata esta situação.

Além disso, implementamos também um exemplo de como tornar o campo 'Descrição/Versão/Revisão' de preenchimento obrigatório, apresentado no momento do check in do documento. O exemplo é apresentado como: Exemplo 1 - Tornar campo descrição/versão/revisão obrigatório.

Exemplo:

Bloco de código
languagejs
linenumberstrue
function beforeDocumentPublisher() {

	// Exemplo de evento que impede o usuário de publicar um documento com descrição 
	// repetida em uma determinada pasta .
	
	
	var state = getValue("WKState");
	

	if (state == "PUBLISH") {

		var doc = getValue("WKDocument");

		// Faz validações apenas se o documento estiver sendo publicado na pasta
		// 624
		if (doc.getParentDocumentId() == 624) {
			// Reduzir o retorno de registros para reduzir impacto em
			// performance.
			var constraintDocument1 = DatasetFactory.createConstraint(
					'sqlLimit', '1', '1', ConstraintType.MUST);
			// Passando código da pasta pai para o Dataset
			var constraintDocument2 = DatasetFactory.createConstraint(
					'parentDocumentId', doc.getParentDocumentId(), doc
							.getParentDocumentId(), ConstraintType.MUST);
			// Consultando apenas registros de documentos ativos.
			var constraintDocument3 = DatasetFactory.createConstraint(
					'activeVersion', 'true', 'true', ConstraintType.MUST);
			// Consultando apenas nos documentos não foram removidos.
			var constraintDocument4 = DatasetFactory.createConstraint(
					'deleted', 'false', 'false', ConstraintType.MUST);
			// Consultando documentos que tenham a mesma descrição informada na
			// publicação
			var constraintDocument5 = DatasetFactory.createConstraint(
					'documentDescription', doc.getDocumentDescription(), doc
							.getDocumentDescription(), ConstraintType.MUST);
			
			var datasetDocument = DatasetFactory.getDataset('document', null,
					new Array(constraintDocument1, constraintDocument2,
							constraintDocument3, constraintDocument4,
							constraintDocument5), null);

			if (datasetDocument.rowsCount > 0) {
				throw "Já existe um documento com a mesma descrição informada";
			}

		}
	}
}
Bloco de código
titleExemplo 1 - Tornar campo descrição/versão/revisão obrigatório
function beforeDocumentPublisher() {

    var doc = getValue("WKDocument");

    // Verifica se a descrição da versão não está preenchida
    if (doc.getVersionDescription() == "") {
        log.info("### Documento: " + doc.getDocumentId() + " - Versão: " + doc.getVersion() + " não está com a Descrição da Versão preenchida!");

        // Informa somente o numero do documento de origem, para o caso de checkin com nova versao/revisao
        var constraintDocument1 = DatasetFactory.createConstraint('allocatedDocumentPK.sourceDocument', doc.getDocumentId(), doc .getDocumentId(), ConstraintType.MUST);
        // Instanciando o dataset
        var datasetDocument = DatasetFactory.getDataset('allocatedDocument', null, new Array(constraintDocument1), null); 
        // Verifica se o documento esta em checkout/checkin e exibe a mensagem
        if (datasetDocument.rowsCount > 0) {
            throw "Para efetuar o checkin é necessário informar a Descrição da Versão!";
        }
    }
}

São disponibilizadas algumas propriedades referentes ao documento que está sendo criado ou editado, porém somente para consulta através do método getValue.

...

List<DocumentSecurityConfigDto>

...

Lista com os documentos relacionados ao documento

...

int

 {
	// Exemplo de implementação

	// CompanyId da empresa
	var companyId = getValue("WKCompany");

	// Nome do arquivo com extensão
	var fileName = getValue("WKFileName");

	// Tamanho do arquivo em bytes
	var fileSize = getValue("WKFileSize");

	// Caminho absoluto do arquivo
	var filePath = getValue("WKFilePath");

	// MimeType dos bytes do arquivo, ou seja, independente da extensão
	var fileMimeType = getValue("WKFileMimeType");

	// UserId do usuário que está realizando o upload
	var userId = getValue("WKUser");

	// A maioria dos mimetypes executáveis começam com "application/x-"
	if (fileMimeType.indexOf("application/x-") !== -1) {

		// Porém alguns tipos começam também com "application/x-", como por exemplo: .rar ou .7zip. Então caso deseja permití-los, pode ser feito assim:
		if (fileMimeType.indexOf("application/x-rar-compressed") !== -1 || fileMimeType.indexOf("application/x-7z-compressed") !== -1) {
			return;
		}

		throwsIfBlocked();
	}

	// Podemos bloquear qualquer outro mimetype, por exemplo:
	if (fileMimeType.indexOf("application/octet-stream") !== -1 || fileMimeType.indexOf("application/exe") !== -1) {
		throwsIfBlocked();
	}

    // Podemos bloquear também pela extensão do arquivo
    if (fileName.match(/.*\.(sh|exe|msi|bat|app)/i)){
        throwsIfBlocked();
    }

	// Função usada para logar uma mensagem no log do servidor e retornar o erro na tela
	function throwsIfBlocked() {
		log.warn("Usuário: '" + userId + "' da Empresa: '" + companyId + "' tentou realizar o upload "
				+ "do Arquivo '" + fileName + "' com o Mimetype: '" + fileMimeType + "' e foi impedido!");

		throw "Este formato de documento não está de acordo com as políticas de segurança e portanto não será permitida sua publicação na plataforma.";
	}
}


São disponibilizadas algumas propriedades referentes ao arquivo que está sendo feito upload através do método getValue.

PropriedadeDescriçãoTipo
WKCompanyCódigo da Empresaint
WKFileNameNome do arquivo com extensão

String

WKFileSizeTamanho do arquivo em byteslong
WKFilePathCaminho absoluto do arquivoString
WKFileMimeTypeMimeType dos bytes do arquivo, ou seja, independente da extensão

String

WKUserUsuário logadoString

ValidateCustomMetadata

Este evento sempre é disparado antes de salvar os valores dos campos customizados de um documento, tanto na publicação como edição. Através dele é possível alterar ou validar os valores dos campos customizados dos metadados de um documento. O evento recebe como parâmetro uma referência aos campos customizados.

Exemplo:

Bloco de código
languagejs
linenumberstrue
function validateCustomMetadata(fields){
}

No contexto deste evento a variável fields pode ser usada para consultar ou modificar os valores dos campos customizados de um documento. Não permitindo adicionar novos campos.
Para inserir novos campos em um documento existe varias maneiras disponíveis.

  • Pela herança da pasta pai.
  • No cadastro de Campos Customizados, marcando a opção Mostrar em todos documentos ou da forma padrão.
  • Através do WebService CustomFieldsService.
  • Na edição dos metadados do documento, pelo usuário.

Para consultar o valor de um campo customizado neste evento, utiliza-se o fields.getValue passando como parâmetro o código do campo desejado. Retornando null, caso o campo não esteja disponível para este documento.


Exemplo:

Bloco de código
languagejs
linenumberstrue
function validateCustomMetadata (fields){
    log.info("Valor do Campo 1: " + fields.getValue("campo1"));
}


Já para realizar a edição utiliza-se o fields.setValue, passando como parâmetro, primeiro o nome do campo, em seguida o valor.

Exemplo:

Bloco de código
languagejs
linenumberstrue
function validateCustomMetadata (fields){
    fields.setValue("campo1","Valor para o Campo 1");
}


Alem dos valores dos campos customizados disponibilizamos algumas informações do documento que está sendo criado ou editado, porém somente para consulta através do método getValue.

WKUserCódigo do usuário
WKCompanyNúmero da empresa
WKNumParentDocumentNúmero da pasta pai

WKDocumentType

 Tipo do documento
WKDocumentTypeId 

ID do tipo de documento

WKPrivateDocumentSe o documento esta sendo publicado na pasta particular (true/false)
WKNumAcess

Número de acessos

WKCommentsComentários do documento
WKAuthorCódigo do autor do documento
WKCreateDateData de criação do documento
WKDescriptionDescrição do documento
WKNumDocumentNúmero do documento
WKNumVersionNúmero da versão do documento
WKExpirationDateData de expiração do documento
WKExpiresDocumento expira? (true/false)
WKFileSizeTamanho do documento em bytes
WKKeyWord

Palavras chaves do documento

WKVolumeVolume do documento
WKSubjectAssunto relacionado ao documento



Informações

Veja o exemplo em nosso repositório aqui.


Exemplo:

Bloco de código
languagejs
linenumberstrue
function validateCustomMetadata (fields){
    log.info("Usuário: " + getValue("WKUser "));
}


As exceções podem ser tratadas utilizando o comando throw. Este comando retornará uma mensagem ao usuário ao tentar salvar o documento.

Exemplo:

Bloco de código
languagejs
linenumberstrue
function validateCustomMetadata (fields){
    if( fields.getValue("campo1") == "Area 1"){
        throw "TRATAMENTO DA EXCEÇÃO";
    }
}

BeforeDocumentPublisher

Utilizado quando é preciso fazer validação customizada nas propriedades da tela de publicação/edição de documentos antes de salva-lo no banco de dados. Dentre todas as propriedades da tela de publicação/edição de documentos não serão tratados os campos customizados, pois já existe um evento que trata esta situação.

São disponibilizadas algumas propriedades referentes ao documento que está sendo criado ou editado, porém somente para consulta através do método getValue.

PropriedadeDescriçãoTipo
WKDocumentObjeto do DocumentoDocumentDto
WKDocumentEditObjeto do Documento

DocumentEditDto


WKSubjectDescrição do Assunto do documentoString
WKListApproverLista dos Aprovadores do documentoList<ApproverDto>
WKListSecurityLista com a segurança do documento

List<DocumentSecurityConfigDto>

WKListRelatedDocument

Lista com os documentos relacionados ao documento

List<RelatedDocumentDto>
WKStateEstado da ação: PUBLISH ou MODIFYString
WKUserUsuário logadoString
WKCompanyCódigo da Empresa

int


O produto retorna null quando for necessário pegar umas das propriedades do documento que não exista.

Por exemplo: Nem todos os documentos publicados tem aprovador, logo a variável WKListApprover só terá informações quando realmente existirem aprovadores na publicação.


Exemplos de implementação:

Deck of Cards
historyfalse
idExemplos beforeDcoumentPublisher
Card
label1- Validar informações do documento

É possível usar vários objetos e fazer validações e é muito comum validar permissões específicas ao negócio do cliente e não permitir a inclusão do documento.

No exemplo abaixo, o trecho de código está mostrando todos os possíveis atributos, declara os possíveis objetos, exibe no log algumas informações desses objetos, depois verifica os aprovadores, validando que não pode conter um usuário administrador como aprovador e exibe todos documentos relacionados.

Bloco de código
languagejs
linenumberstrue
function beforeDocumentPublisher(){
                
                var doc = getValue("WKDocument");
                var subject = 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("Usuário Logado: " + user);
 
 
                log.info("Empresa: " + company);
                
                log.info("Número do documento: "+ doc.getDocumentId() + " - Versão: "+ doc.getVersion());
                
                if(listApprover!=null){
                    for(j = 0; j < listApprover.size(); j++) {          
                        if (listApprover.get(j).getColleagueId().equals("adm")){
                            throw "O usuário adm não pode ser aprovador de documentos";
                        }
                    }
                }
 
 
                if(listSeg != null){
                    for(j = 0; j < listSeg.size(); j++) {    
                        if (listSeg.get(j).getAttributionValue().equals("cvd")){
                            throw "O usuário cvd não pode estar na segurança de documentos";
                        }
                    }
                }
 
 
                if( listRelated != null){
                    log.info("Os seguintes documentos estão relacionados a este documentos: ");
                        for(j = 0; j < listRelated.size(); j++) {         
                            log.info("Nr. documento: "+ listRelated.get(j).getRelatedDocumentId());
                        }
                }
                log.info("Assunto: " + subject);
                log.info("Estado: " + state);
}
Card
label2- Impedir publicação com descrição repetida

Exemplo de evento que impede o usuário de publicar um documento com descrição repetida em uma determinada pasta.

Bloco de código
languagejs
linenumberstrue
function beforeDocumentPublisher() {
	// Exemplo de evento que impede o usuário de publicar um documento com descrição
    // repetida em uma determinada pasta levando em consideração também se o documento esta na lixeira.
	// caso não queira considerar a lixeira é só remover a validação da mesma, porem o documento poderá
	// ser restaurando da lixeira para pasta duplicando assim o nome do arquivo.


    var state = getValue("WKState");


    if (state == "PUBLISH") {

        var doc = getValue("WKDocument");

        // Faz validações apenas se o documento estiver sendo publicado na pasta selecionada (trocar o "6" pelo numero da pasta desejada)
        // Valida também se o documento esta sendo publicado como novo opção (getVersionOption), caso seja somente alteração ou seja, nova revisão ou versão passa
        if (doc.getParentDocumentId() == 6 && doc.getVersionOption() == 0) {

        	 //###############################################################################################
            //documentos ativos

            // Reduz o retorno de registros para reduzir impacto em performance.
            var constraintDocument1 = DatasetFactory.createConstraint(
                    'sqlLimit', '0', '1', ConstraintType.MUST);

            // Passando código da pasta pai para o Dataset
            var constraintDocument2 = DatasetFactory.createConstraint(
                    'parentDocumentId', doc.getParentDocumentId(), doc
                            .getParentDocumentId(), ConstraintType.MUST);

            // Consultando apenas registros de documentos ativos.
            var constraintDocument3 = DatasetFactory.createConstraint(
                    'activeVersion', 'true', 'true', ConstraintType.MUST);

            // Consultando apenas nos documentos que não foram removidos.
            var constraintDocument4 = DatasetFactory.createConstraint(
                    'deleted', 'false', 'false', ConstraintType.MUST);

            // Consultando documentos que tenham a mesma descrição informada na
            // publicação
            var constraintDocument5 = DatasetFactory.createConstraint(
                    'documentDescription', doc.getDocumentDescription(), doc
                            .getDocumentDescription(), ConstraintType.MUST);

            var datasetDocumentActive = DatasetFactory.getDataset('document', null,
                    new Array(constraintDocument1, constraintDocument2,
                            constraintDocument3, constraintDocument4,
                            constraintDocument5), null);


            //###############################################################################################
            //Considera o documento que esta na lixeira

            // Consultando apenas registros de documentos inativos.
            constraintDocument3 = DatasetFactory.createConstraint(
                    'activeVersion', 'false', 'false', ConstraintType.MUST);

            // Consultando apenas nos documentos que foram removidos.
            constraintDocument4 = DatasetFactory.createConstraint(
                    'deleted', 'true', 'true', ConstraintType.MUST);

O produto retorna null quando for necessário pegar umas das propriedades do documento que não exista.

Por exemplo: Nem todos os documentos publicados tem aprovador, logo a variável WKListApprover só terá informações quando realmente existirem aprovadores na publicação.

Exemplo:

Bloco de código
languagejs
linenumberstrue
function beforeDocumentPublisher(){

            var datasetDocumentDeleted = DatasetFactory.getDataset('document', null,
                
var
   
doc
 
=
new 
getValue("WKDocument");
Array(constraintDocument1, constraintDocument2,
                            constraintDocument3, constraintDocument4,
                
var subject = getValue("WKSubject"
            constraintDocument5), null);


            var isExistDoc = datasetDocumentActive != null 
var listApprover = getValue("WKListApprover");
&& datasetDocumentActive.rowsCount > 0
                
var listSeg = getValue("WKListSecurity"
&& (datasetDocumentActive.getValue(0, "documentDescription") == doc.getDocumentDescription());

            var isExistDocDeleted = datasetDocumentDeleted 
var
!= 
listRelated
null 
= getValue("WKListRelatedDocument");
&& datasetDocumentDeleted.rowsCount > 0
              
var
 
state
 
=
&& (datasetDocumentDeleted.getValue(0, "
WKState")
documentDescription") == doc.getDocumentDescription());


            if (isExistDoc || 
var user = getValue("WKUser");
isExistDocDeleted) {
                throw "Já existe um documento com 
var
a 
company
mesma 
=
descrição 
getValue(
informada"
WKCompany")
;
   
  
       }

        
log.info("Usuário Logado: " + user);
}
    }
}
Card
label3- Tornar campo descrição/versão/revisão obrigatório

Exemplo de como tornar o campo 'Descrição/Versão/Revisão' de preenchimento obrigatório, apresentado no momento do check-in do documento. 

Bloco de código
languagejs
linenumberstrue
function beforeDocumentPublisher() {

    var doc 
log.info("Empresa: " + company);
= getValue("WKDocument");

    // Verifica se a descrição da versão não está 
preenchida
    if (doc.getVersionDescription() == "") {
        log.info("
Número
### 
do documento
Documento: " + doc.getDocumentId() + " - Versão: " + doc.getVersion()
);
 + " não está com a Descrição da 
Versão preenchida!");

        // Informa somente o 
if(listApprover!=null){
numero do documento de origem, para o caso de checkin com nova versao/revisao
        var 
for(j
constraintDocument1 = 
0; j < listApprover.size(); j++) {
DatasetFactory.createConstraint('allocatedDocumentPK.sourceDocument', doc.getDocumentId(), doc .getDocumentId(), ConstraintType.MUST);
        // Instanciando o dataset
        var datasetDocument = DatasetFactory.getDataset('allocatedDocument', null, 
if (listApprover.get(j).getColleagueId().equals("adm")){
new Array(constraintDocument1), null); 
        // Verifica se o documento esta em checkout/checkin e exibe a mensagem
     
throw
 
"O
 
usuário
 
adm não pode ser aprovador de documentos";
if (datasetDocument.rowsCount > 0) {
            throw "Para efetuar o checkin é necessário informar a Descrição 
}
da Versão!";
        }
    
}
}
}
Card
label4- Parametrizar keyword do documento

Exemplo de uso do parâmetro WKDocumentEdit no evento, para que seja possível atualizar o campo keyWord do documento.

Bloco de código
languagejs
linenumberstrue
function beforeDocumentPublisher() {
    var doc 
} if(listSeg != null){
= getValue("WKDocument");
    log.info("KeyWord Atual: " + doc.getKeyWord());

    
for(j = 0; j < listSeg.size(); j++) {
var docEdit = getValue("WKDocumentEdit");
    docEdit.setKeyWord("Novo");
    log.info("KeyWord Novo: " + docEdit.getKeyWord());
}
Card
label5- Impedir publicação pela extensão do arquivo físico

Exemplo de como impedir a publicação pela extensão do arquivo físico.

Bloco de código
languagejs
linenumberstrue
function beforeDocumentPublisher(){
    var doc = getValue("WKDocument");
    var ext 
if (listSeg.get(j).getAttributionValue().equals("cvd")){
= [".exe",".reg"];

    for (var i = 0; i < ext.length; i++) {
        if (doc.getPhisicalFile().endsWith(ext[i])) { 
    
throw
 
"O
 
usuário
 
cvd
 
não
 
pode
 
estar
 
na
 
segurança de
throw 
documentos
"
;
Desculpe, este tipo de arquivo não é permitido por razões de segurança"; 
        }
    
} }
}
}
Card
label6- Controlando a versão manualmente em novos documentos

Exemplo de uso do parâmetro WKDocumentEdit no evento para que seja possível controlar as propriedades version, validationStartDate e expirationDate do documento.

Bloco de código
languagejs
linenumberstrue
function beforeDocumentPublisher() {
    var doc 
} if( listRelated != null){
= getValue("WKDocument");

    log.info("DocumentId Atual: " + doc.getDocumentId());
    log.info("Version Atual: " + doc.getVersion());
    log.info("DocumentType Atual: " + doc.getDocumentType());
    log.info("ValidationStartDate Atual: " + doc.getValidationStartDate());
    log.info("
Os
ExpirationDate 
seguintes
Atual: 
documentos
" 
estão relacionados a este documentos: ");
+ doc.getExpirationDate());

    // Quando documento é novo e o tipo de documento é Documento normal.
    
for(j
if (doc.getDocumentId() == 0
;
 
j < listRelated.size(); j++
&& doc.getDocumentType() == "2") {
	    var docEdit 
= getValue("WKDocumentEdit");

	    docEdit.setVersion(3);
	    log.info("Version Novo: " + docEdit.getVersion());
	    
	    
docEdit.setValidationStartDate(stringToDate("26/05/2023 00:00:00"));
	    
log.info("
Nr.
ValidationStartDate 
documento
Novo: " + 
listRelated
docEdit.
get
getValidationStartDate(
j
)
.getRelatedDocumentId(
)
)
;
	    
	    docEdit.setExpirationDate(stringToDate("27/05/2023 16:50:30"));
	    log.info("ExpirationDate Novo: " 
+ docEdit.getExpirationDate());
    
}
    
    
}
function stringToDate(dateString){
        var format = 
log.info("Assunto: " + subject
new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        return format.parse(dateString);  
    
log.info("Estado: " + state);
}
}


AfterDocumentPublisher

Utilizado quando é preciso fazer alguma manipulação customizada nas propriedades da tela de publicação/edição de documentos depois que ele foi salvo no banco de dados. Dentre todas as propriedades da tela de publicação/edição de documentos não serão tratados os campos customizados.

...

Informações

Veja o exemplo (event-document-expiration-date-validation) no repositorio do fluigTOTVS Fluig Plataforma clicando aqui.


BeforeDownloadContent

...

Desenvolvimento de Eventos JMS

...

O fluig TOTVS Fluig Plataforma suporta o desenvolvimento de eventos JMS, permitindo criar procedimentos de auditoria com base nas informações fornecidas pelo produto. O JMS (Java Message Service) é uma API Java™ que provê uma conexão assíncrona entre aplicações por meio de troca de mensagens.

O produto dispara um tipo de mensagem JMS personalizável, o wdkDocument. O wdkDocument será acionado quando houver manipulação nos documentos do fluigda plataforma.

Para a aplicação receber a mensagem com as informações do documento, a classe tem que estender o MessageListener e ter a seguinte linha:

...