...
Disponibilizamos algumas informações sobre o usuário e a empresa, porem somente para consulta através do método getValue.
WKUser | Código do usuário |
WKCompany | Número da empresa |
Bloco de código |
---|
function displayCentralTasks (links){log.info("Usuário: “ + getValue("WKUser"));} |
...
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.
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.
Bloco de código |
---|
function displayCustomMetadata(fields){fields.setValue("campo1","Valor para o Campo 1");} |
...
WKUser | Código do usuário |
WKCompany | Número da empresa |
WKNumParentDocument | Número da pasta pai |
WKDocumentType | Tipo do documento |
WKPrivateDocument | Se o documento esta sendo publicado na pasta particular (true/false) |
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.
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.
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.
Bloco de código |
---|
function validateCustomMetadata (fields){fields.setValue("campo1","Valor para o Campo 1");} |
...
WKUser | Código do usuário |
WKCompany | Número da empresa |
WKNumParentDocument | Número da pasta pai |
WKDocumentType | Tipo do documento |
WKPrivateDocument | Se o documento esta sendo publicado na pasta particular (true/false) |
WKNumAcess | Numero de acessos |
WKComments | Comentários do documento |
WKAuthor | Código do autor do documento |
WKCreateDate | Data de criação do documento |
WKDescription | Descrição do documento |
WKNumDocument | Número do documento |
WKNumVersion | Número da versão do documento |
WKExpirationDate | Data de expiração do documento |
WKExpires | Documento expira? (true/false) |
WKFileSize | Tamanho do documento em bytes |
WKKeyWord | Palavras chaves do documento |
WKVolume | Volume do documento |
WKSubject | Assunto relacionado ao documento |
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.
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.
Bloco de código |
---|
function beforeDocumentPublisher(){ } |
...
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.
Bloco de código |
---|
function afterDocumentPublisher(){ } |
...
Utilizado quando é preciso fazer validação customizada antes da visualização de algum documento.
Bloco de código |
---|
function beforeDocumentViewer (){ } |
...
Informações | ||
---|---|---|
| ||
Os objetos Dto’s serão explicados no capítulo “Objetos utilizados nos eventos” |
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.
Bloco de código |
---|
function afterSaveCard(companyId, formId, cardId, versionId, cardData){} |
...
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
formId | Código do Fichário | int |
cardId | Código da Ficha | int |
versionId | Versão da Ficha | int |
cardData | Dados da Ficha | HashMap<String,String> |
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.
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); } |
...
Sendo os parâmetros:
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
cardId | Código da Ficha | int |
Existem alguns objetos disponibilizados pelo produto que são utilizados nos eventos, nas próximas sessões eles serão explicados seus métodos e seus retornos.
Função | Descrição da Função | Tipo do Retorno |
---|---|---|
getDocumentId() | Retorna o número do documento | int |
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 |
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 documento | String |
getIconId() | Retorna o código do Ícone do documento | int |
getTopicId() | Retorna o código do assunto do documento | int |
getColleagueId() | Retorna a matricula do colaborador que criou o documento | String |
getDocumentDescription() | Retorna a descrição do documento | String |
getAdditionalComments() | Retorna os comentários adicionais do documento | String |
getPhisicalFile() | Retorna o nome do arquivo físico atrelado ao documento | String |
getCreateDate() | Retorna a data de criação | java.util.Date |
getApprovedDate() | Retorna a data de Aprovação | java.util.Date |
getLastModifiedDate() | Retorna a Data da última modificação | java.util.Date |
getDocumentType() | Retorna o tipo do documento, onde: 9 →Aplicativo portal →Site | String |
getExpirationDate() | Retorna a data de expiração | java.util.Date |
getParentDocumentId() | Retorna o número da Pasta/Fichário pai | int |
getRelatedFiles() | String com o nome do arquivo físico principal e anexos | String |
getActiveVersion() | Retorna se a versão é ativa | boolean |
getVersionDescription() | Retorna a descrição da versão | String |
getDownloadEnabled() | Retorna se o documento permite Download | boolean |
getApproved() | Retorna se o documento está em aprovação | boolean |
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 criada | int |
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 indexado | boolean |
getPriority() | Retorna a prioridade do documento | int |
getUserNotify() | Retorna se notifica os usuários que tenham esse assunto de interesse | boolean |
getExpires() | Retorna se o documento está expirado | boolean |
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 pai | boolean |
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 lixeira | boolean |
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ável | boolean |
getDraft() | Retorna se o documento está em edição, para documento do tipo “Novo Conteúdo” | boolean |
getInternalVisualizer() | Retorna se utiliza visualizador interno | boolean |
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 |
Bloco de código |
---|
var doc = getValue("WKDocument");
log.info("Número do documento: "+ doc.getDocumentId() + " - Versão: "+ doc.getVersion()); |
Este objeto que representa os aprovadores e suas propriedades, na tabela abaixo consta mais informações sobre ele:
Função | Descrição da Função | Tipo do Retorno |
---|---|---|
getDocumentId() | Retorna o número do documento | int |
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: | int |
getLevelId() | Retorna o nível de aprovação, no caso de aprovação em níveis | int |
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";
}
}
} |
Este objeto que representa a segurança de um documento e suas propriedades, na tabela abaixo consta mais informações sobre ele:
Função | Descrição da Função | Tipo do Retorno |
---|---|---|
getDocumentId() | Retorna o número do documento | int |
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: | int |
getPermission() | Retorna se é uma permissão. | boolean |
getShowContent() | Retorna se lista o conteúdo | boolean |
getSecurityLevel() | Retorna no nível de permissão/restrição, onde:
0 →Leitura; | int |
getSequence() | Retorna a sequência da permissão/restrição | int |
getSecurityVersion() | Retorna se ele utiliza a segurança deste versão nas demais | boolean |
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ção | Descrição da Função | Tipo do Retorno |
---|---|---|
getDocumentId() | Retorna o número do documento | int |
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
|
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());
}
} |
O ECM tem customização 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 dois tipos de mensagens JMS customizáveis, o wdkDocument e o wdkAbstract.
O wdkDocument será disparado quando houver manipulação nos documentos do ECM, 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:
Bloco de código |
---|
@MessageDriven(mappedName = "custom/DocumentListener", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue =
"javax.jms.Topic"),
@ActivationConfigProperty(propertyName = "destination", propertyValue =
"topic/wdkDocument")
}) |
O objeto de retorno será um MapMessage que conterá os seguintes parâmetros:
Evento | Descrição |
---|---|
PUBLISH | Um novo documento publicado. |
MODIFY | Documento é modificado |
DELETE | Documento é excluído da base de dados. |
SENDRECYCLE | Documento é enviado para lixeira. |
DELETEFOLDER | Uma pasta é excluída da base de dados. |
EXTERNALCONVERTION | Documento com conversão customizada. |
CONVERTIONLONGTERM | Documento convertido para longo prazo. |
MOVE | Um ou mais documento ou pastas foram movidos de uma pasta para outra. |
RESTORERECYCLE | Restaura documentos e pastas da Lixeira. |
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();
}
}
} |
O wdkAbstract será disparado quando houver manipulação em alguns objetos no ECM , conforme tabela abaixo:
Objeto | Descrição | Tabela no BD |
---|---|---|
Group | Grupo | GRUPO |
ColleagueGroup | Grupo do Colaborador | GRUPO_COLABORADOR |
Icon | Ícone | ICONE |
Topic | Assunto | ASSUNTO |
Shortcut | Segurança de Menu | MENU_ICONE |
Colleague | Colaborador | COLABORADOR |
LogAccess | Log de Acesso | LOG_ACCESS |
ColleagueReplacement | Substituto | COLAB_SUBSTTO |
Application | Aplicativo | APLICATIVO |
ProgressLib | Ambiente Progress | AMBIEN_PROGRESS |
GlobalCalendar | Feriado | CALEND_GLOBAL |
WorkflowRole | Papel Workflow | PAPEL_WORKFLOW |
GlobalParam | Parâmetros Gerais | PARAM_GERAL |
Term | Termo | TERMO |
Synonym | Sinônimo | SINONIMO |
DocumentType | Tipo do Documento | TIPO_DOCUMENTO |
Volume | Volume | VOL_FISIC |
AttributionMecanism | Mecanismo de Atribuição | MECAN_ATRIBUIC |
EmailTemplate | Template de Email | TEMPLATE_EMAIL |
CustomizedDatasetBuilder | Dataset | SERV_DATASET |
DataService | Serviços | SERV_DADOS |
CustomFields | Campos Customizados | CAMPO_CUSTOM |
UserGraphicSetings | DashBoard | CONFIGUR_GRAF_USUAR |
Watermark | Marca D’água | MARCA_DAGUA |
WebLayout | Layout | WEBLAYOUT |
Adapter | Adaptadores | ADAPTER |
Para a aplicação receber a mensagem com as informações destes objetos a classe tem que estender o MessageListener e ter a seguinte linha:
Bloco de código |
---|
@MessageDriven(mappedName = "custom/DocumentListener", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue =
"javax.jms.Topic"),
@ActivationConfigProperty(propertyName = "destination", propertyValue =
"topic/wdkAbstract")
}) |
objeto de retorno será um MapMessage que conterá os seguintes parâmetros:
Evento | Descrição |
---|---|
CREATE | Um novo objeto foi criado. |
UPDATE | Um objeto foi modificado |
DELETE | Um objeto foi excluído da base de dados. |
Informações |
---|
Este mapa não terá objetos quando o evento for CREATE e DELETE. |
Para transformar o Array de bytes recebido na mensagem em um HashMap basta utilizar a função abaixo:
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;
} |
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;
}
}
|