Home

TOTVS | Plataformas e tecnologias

Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

WKUserCódigo do usuário
WKCompany

Número da empresa

 

Exemplo:

Bloco de código
function displayCentralTasks (links){log.info("Usuário: “ + getValue("WKUser"));}

...

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

 

Exemplo:

Bloco de código
function displayCustomMetadata(fields){}

...

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”, casso o campo não esteja disponível para este documento.

 

Exemplo:

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

...

Já pra 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
function displayCustomMetadata(fields){fields.setValue("campo1","Valor para o Campo 1");}

...

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

Se o documento esta sendo publicado

na pasta particular (true/false)

 

Exemplo:

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

...

Este evento é disparado sempre 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
function validateCustomMetadata(fields){}

...

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”, casso o campo não esteja disponível para este documento.

 

Exemplo:

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

...

Já pra 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
function validateCustomMetadata (fields){fields.setValue("campo1","Valor para o Campo 1");}

...

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

Se o documento esta sendo publicado

na pasta particular (true/false)

WKNumAcess

Numero 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
WKKeyWordPalavras chaves do documento
WKVolumeVolume do documento
WKSubjectAssunto relacionado ao documento

 

Exemplo:

Bloco de código
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
function validateCustomMetadata (fields){if( fields.getValue("campo1") == “Area 1”){throw "TRATAMENTO DA EXCEÇÃO";}}

...

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.

Exemplo:

Bloco de código
function beforeDocumentPublisher(){ }

...

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, então a variável WKListApprover só terá informações quando realmente existirem aprovadores na publicação.

 

Exemplo:

Bloco de código
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);
}

...

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.

 

Exemplo:

Bloco de código
function afterDocumentPublisher(){ }

...

Utilizado quando é preciso fazer validação customizada antes da visualização de algum documento.

 

Exemplo:

Bloco de código
function beforeDocumentViewer (){ }

...

Informações
titleObservação

Os objetos Dto’s serão explicados no capítulo “Objetos utilizados nos eventos”

Exemplo:

Bloco de código
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("Erro ao tentar recuperar o documento em CheckOut: " + e.message);
         }
   if(ds!=null && ds.rowsCount>0){
        throw "Este documento está em Check Out e não pode ser visualizado. Foi gerado o documento " + ds.getValue(0,"allocatedDocumentPK.destinationDocument") + " que está sob responsabilidade do colaborador com matrícula "+ ds.getValue(0,"colleagueId");
        }
   }

...

Utilizado quando ao criar/salvar os dados de uma ficha pelo GED ou por movimentações workflow se deseja salvar os dados da ficha em uma forma externa. Por exemplo, ao criar a ficha, enviar os dados da ficha para um Webservice de outro produto.

 

Exemplo:

Bloco de código
function afterSaveCard(companyId, formId, cardId, versionId, cardData){}

...

PropriedadeDescriçãoTipo
companyIdCódigo da Empresaint
formIdCódigo do Fichárioint
cardIdCódigo da Fichaint
versionIdVersão da Fichaint
cardDataDados da FichaHashMap<String,String>

 

 

Exemplo:

Bloco de código
function afterSaveCard(companyId, formId, cardId, versionId, cardData){
  var custom = ServiceManager.getService("CustomCard");
  var serviceHelper = custom.getBean();
  var serviceLocator =
serviceHelper.instantiate("com.totvs.technology.webdesk.forms.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");
 
    field1.setKey(key);
             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);
}

...

Utilizado como complemento do evento afterSaveCard. É chamado toda vez que um fichário ou uma ficha é eliminado da lixeira.

 

Exemplo:

Bloco de código
function afterDeleteCard(companyId,cardId){
   var custom = ServiceManager.getService("CustomCard");
   var serviceHelper = custom.getBean();
   var serviceLocator =
serviceHelper.instantiate("com.totvs.technology.webdesk.forms.service.custom.CustomCardServiceLocator");
   var service = serviceLocator.getCustomCardPort();
   log.info("########## carregou serviço CustomCard");
   service.deleteCard(companyId, cardId);
}

...

FunçãoDescrição da FunçãoTipo do Retorno
getDocumentId()Retorna o número do documentoint
getVersion()Retorna o número da versão do documentoint
getCompanyId()

Retorna o código da empresa em que

o documento foi publicado

Int
getUUID()

Retorna o UUID (identificador Único Global)

do documento

String
getDocumentTypeId()

Retorna o tipo do arquivo físico, se retornar branco

ou nulo é porque esse tipo não é conhecido

pelo ECM

String
getLanguageId()Retorna o código do Idioma do documentoString
getIconId()Retorna o código do Ícone do documentoint
getTopicId()Retorna o código do assunto do documentoint
getColleagueId()

Retorna a matricula do colaborador que

criou o documento

String
getDocumentDescription()Retorna a descrição do documentoString
getAdditionalComments()Retorna os comentários adicionais do documentoString
getPhisicalFile()

Retorna o nome do arquivo físico atrelado

ao documento

String
getCreateDate()Retorna a data de criaçãojava.util.Date
getApprovedDate()Retorna a data de Aprovaçãojava.util.Date
getLastModifiedDate()Retorna a Data da última modificaçãojava.util.Date
getDocumentType()

Retorna o tipo do documento, onde:
0 →Pasta raiz
1 →Pasta
2 →Documento normal
3 →Documento externo
4 →Fichário
5 →Ficha
7 →Anexo Workflow
8 →Novo Conteúdo

9 →Aplicativo
10 →Relatório

portal →Site
portalPage →Página de Site

String
getExpirationDate()Retorna a data de expiraçãojava.util.Date
getParentDocumentId()Retorna o número da Pasta/Fichário paiint
getRelatedFiles()

String com o nome do arquivo físico principal

e anexos

String
getActiveVersion()Retorna se a versão é ativaboolean
getVersionDescription()Retorna a descrição da versãoString
getDownloadEnabled()Retorna se o documento permite Downloadboolean
getApproved()Retorna se o documento está em aprovaçãoboolean
getValidationStartDate()

Retorna a partir de que data em que o

documento poderá ser visualizado

java.util.Date
getPublisherId()

Retorna a matricula do colaborador

que publicou o documento

String
getCardDescription()

Retorna a descrição da ficha,

para documento do tipo 5

String
getDocumentPropertyNumber()

Retorna o fichário que foi usado como base para

criação da ficha, por isso só tem um valor quando o

documento é do tipo 5 (ficha)

int
getDocumentPropertyVersion()Retorna a versão do fichário em que a ficha foi criadaint
getPrivateDocument()

Retorna se o documento/pasta está abaixo

da pasta particular

boolean
getPrivateColleagueId()

Se é um documento particular retorna a matricula

do colaborador onde este documento está alocado

String
getIndexed()Retorna se o documento já foi indexadoboolean
getPriority()Retorna a prioridade do documentoint
getUserNotify()

Retorna se notifica os usuários que tenham

esse assunto de interesse

boolean
getExpires()Retorna se o documento está expiradoboolean
getVolumeId()

Retorna o volume onde o documento foi publicado,

se estiver em branco ele utiliza o volume do pai

String
getInheritSecurity()Retorna se herda segurança do paiboolean
getUpdateIsoProperties()

Retorna se atualiza as propriedades

da cópia controlada

boolean
getLastModifiedTime()

Retorna a hora da última modificação em

milissegundos

String
getDeleted()Retorna se o documento está na lixeiraboolean
getDatasetName()

Retorna o documento do dataset ,

se o documento é um fichário

String
getKeyWord()

Retorna as palavras chaves do documento.

Cada palavra é separada por vírgula

String
getImutable()Retorna se a versão/revisão é inalterávelboolean
getDraft()

Retorna se o documento está em edição, para

documento do tipo “Novo Conteúdo”

boolean
getInternalVisualizer()Retorna se utiliza visualizador internoboolean
getPhisicalFileSize()

Retorna o tamanho físico do documento

principal e anexos

float
getIsEncrypted()

Retorna se o arquivo PDF publicado possui

algum tipo de segurança

boolean

 

Exemplo de utilização:

Bloco de código
var doc = getValue("WKDocument"); 
log.info("Número do documento: "+ doc.getDocumentId() + " - Versão: "+ doc.getVersion());

...

FunçãoDescrição da FunçãoTipo do Retorno
getDocumentId()Retorna o número do documentoint
getVersion()

Retorna o número da versão do

documento.

int
getCompanyId()

Retorna o código da empresa em

que o documento foi publicado

Int
getColleagueId()

Retorna a matricula de um colaborador ou o código do grupo

que está aprovando este documento. É possível saber se vai retornar

um colaborador ou um grupo pelo tipo de aprovação

String
getApproverType()

Retorna o tipo da aprovação, onde:
0 →Colaborador
1 →Grupo

int
getLevelId()Retorna o nível de aprovação, no caso de aprovação em níveisint

 

Exemplo de utilização:

Bloco de código
var listApprover = getValue("WKListApprover");
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 aprovadores de documentos";
    }
  }
}

...

FunçãoDescrição da FunçãoTipo do Retorno
getDocumentId()Retorna o número do documentoint
getVersion()

Retorna o número da versão do

documento

int
getCompanyId()

Retorna o código da empresa em

que o documento foi publicado

Int
getAttributionValue()

Retorna a matricula de um colaborador ou o código do grupo que

está na segurança deste documento. É possível saber se vai

retornar um colaborador ou um grupo

pelo tipo da segurança.

Obs.: Retorna em branco quando o tipo é todos os usuários.

String
getAttributionType()

Retorna o tipo da segurança, onde:
1 →Colaborador;
2 →Grupo;
3 →Todos os Usuários

int
getPermission()

Retorna se é uma permissão.
Obs.: Se não é uma permissão é uma restrição

boolean
getShowContent()Retorna se lista o conteúdoboolean
getSecurityLevel()

Retorna no nível de permissão/restrição, onde:

  • sem permissão/restrição (nega acesso);

0 →Leitura;
1 →Gravação;
2 →Modificação;
3 →Total.

int
getSequence()Retorna a sequência da permissão/restriçãoint
getSecurityVersion()Retorna se ele utiliza a segurança deste versão nas demaisboolean

 

Exemplo de utilização:

Bloco de código
var listSeg = getValue("WKListSecurity");
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";
         }
    }
}

...

FunçãoDescrição da FunçãoTipo do Retorno
getDocumentId()Retorna o número do documentoint
getVersion()

Retorna o número da versão do

documento

int
getCompanyId()

Retorna o código da empresa

em que o documento foi publicado

int
getRelatedDocumentId()

Retorna o número do documento

que está relacionado ao documento publicado

int

 

 

Exemplo de utilização

Bloco de código
var listRelated = getValue("WKListRelatedDocument");
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());
      }
  }

...

  • companyId (Integer): Código da empresa em que o documento foi manipulado;
  • colleagueId (String): Usuário que efetuou a ação;
  • documentId (Integer): Código do documento que sofreu a ação;
  • version (Integer): Número da versão do documento;
  • lhasCreatedDocument (Boolean):Informa se criou o documento.
  • IhasIncreasedVersion (Boolean): Informa se foi incrementada a versão;
  • changedApproval (Boolean): Informa se o aprovador foi modificado;
  • documento (byte[ ]): Array de bytes com o documento e suas propriedades.

 

Exemplo de utilização:

Bloco de código
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 DocumentListenerMessageBean implements MessageListener {
 
  @Override
  public void onMessage(Message message) {
    try {
      System.out.println("========Document 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));
        }
     }
     System.out.println("========Fim Document Listener========");
   } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

...

Bloco de código
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;
  }         

Exemplo de utilização:

Bloco de código
package com.totvs.ecm.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;
    }
  }
 

...