A customização de eventos é realizada pela criação de scripts na linguagem “JavaScript”. O código de implementação de cada script é armazenado em banco de dados e dispensa o uso de quaisquer outros arquivos, como por exemplo, “custom.p”.
Os eventos de customização para o Fluig são criados pelo administrador, a partir do Fluig Studio. No projeto Fluig, clique com o botão direito sobre a pasta events e em seguida Novo -> Evento Global Fluig conforme a figura abaixo.
Figura 1 - Criação de evento - Fluig Studio.
Em seguida basta informar o Servidor e o Nome do Evento que será adicionado. Uma tela para edição do evento será aberta, conforme imagem a seguir:
Figura 2 - Criação de evento - Fluig Studio.
É possível observar também que o arquivo .js foi adicionado a pasta events do projeto.
O Fluig permite utilizar o log de execução nos eventos de customização. Através da variável global “log” é possível obter o feedback da execução de cada evento. Existem quatro níveis de log, são eles:
A apresentação de cada um dos tipos de log está condicionada a configuração do servidor de aplicação. Por exemplo, no JBoss®, por padrão, as mensagens do tipo info e warn são apresentadas no console do servidor e as do tipo debug, error são apresentadas no arquivo de log. Abaixo um exemplo de uso do log em script:
log.info(“Testando o log info”); |
Teríamos no console do servidor a mensagem “Testando o log info”.
Grande parte dos eventos possuem WKUser para identificar o usuário. Esse ao utilizar a função de substituto, onde um usuário pode substituir outro, irá sempre retornar o usuário que está no momento utilizando o sistema. Exemplo: Ana colocou Bruno como seu substituto, Bruno acessa o sistema e faz uma ação em nome da Ana, sistema irá retornar o código do usuário Bruno nos eventos que usam WKUser. |
De uma forma geral, os eventos do tipo before são executados antes que a ação que disparou o evento seja efetivada, desta forma é possível filtrar os dados que são passados ou até mesmo evitar que a ação executada seja concluída.
Para bloquear a ação basta lançar uma Exception passando uma mensagem de texto que será exibida em formado de toast para o usuário:
Exemplo:
throw "Você não pode efetuar esta ação após as 18 horas." |
Já os eventos do tipo after são executados após a efetivação da ação e não possuem nenhuma influência sobre esta. Ou seja, qualquer dado alterado no parâmetro recebido dentro do evento não será refletido sobre o conteúdo persistido da ação.
Outra característica interessante desse tipo de evento é que eles não devem lançar exceção, caso isso ocorra a exceção ignorada pelo sistema.
A seguir serão detalhados os eventos disponíveis no Fluig.
Este evento permite customizar a conversão de documento realizada pelo Fluig. Mais informações sobre ele podem ser encontradas no guia Conversores de Documentos.
Este evento é disparado sempre antes de ser exibida a central de tarefas. Através dele é possível inserir, alterar ou remover os links da central de tarefas. O evento recebe como parâmetro um LinkedHashMap com os links disponíveis na central de tarefas.
Exemplo adicionando um link customizado ao final dos itens da central de tarefas:
function displayCentralTasks (links){ links.put("Fluig","http://www.fluig.com"); } |
Exemplos alterando a ordem de exibição dos links padrões e adicionando três novos, um no início e dois ao 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); } |
Disponibilizamos algumas informações sobre o usuário e a empresa, porém somente para consulta através do método getValue.
WKUser | Código do usuário |
WKCompany | Número da empresa |
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.
function displayCustomMetadata(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 diversos maneiras disponíveis.
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.
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.
function displayCustomMetadata(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.
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) |
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.
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.
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.
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.
function validateCustomMetadata (fields){ fields.setValue("campo1","Valor para o Campo 1"); } |
Alem dos valores dos campos customizados disponibilizamos algumas informações do documento que esta sendo criado ou editado, porém somente para consulta através do método getValue.
WKUser | Código do usuário |
WKCompany | Número da empresa |
WKNumParentDocument | Número da pasta pai |
WKDocumentType | Tipo do documento |
WKDocumentTypeId | ID do tipo de documento |
WKPrivateDocument | Se o documento esta sendo publicado na pasta particular (true/false) |
WKNumAcess | Número 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 |
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.
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.
function beforeDocumentPublisher(){ } |
São disponibilizadas algumas propriedades referentes ao documento que esta sendo criado ou editado, porem somente para consulta através do método getValue.
Propriedade | Descrição | Tipo |
WKDocument | Objeto do Documento | DocumentDto |
WKSubject | Descrição do Assunto do documento | String |
WKListApprover | Lista dos Aprovadores do documento | List<ApproverDto> |
WKListSecurity | Lista com a segurança do documento | List <DocumentSecurityConfigDto> |
WKListRelatedDocument | Lista com os documentos relacionados ao documento | List< RelatedDocumentDto> |
WKState | Estado da ação: PUBLISH ou MODIFY | String |
WKUser | Usuário logado | String |
WKCompany | Código da Empresa | int |
Os objetos Dto’s serão explicados no capítulo “Objetos utilizados nos eventos” |
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.
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.
function afterDocumentPublisher(){ } |
As propriedades recuperadas através do método getValue() são as mesmas do eventos beforeDocumentPublisher e a forma de manipulação das propriedades pode ser vista no exemplo do evento beforeDocumentPublisher.
Utilizado quando é preciso fazer validação customizada antes da visualização de algum documento.
function beforeDocumentViewer (){ } |
São disponibilizadas algumas propriedades referentes ao documento que esta sendo visualizado, porem somente para consulta através do método getValue.
Propriedade | Descrição | Tipo |
WKDocument | Objeto do Documento | DocumentDto |
WKUser | Usuário logado. | String |
WKCompany | Código da Empresa | int |
Os objetos Dto’s serão explicados no capítulo “Objetos utilizados nos eventos”. |
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 usuário com matrícula "+ ds.getValue(0,"colleagueId"); } } |
Utilizado quando ao criar/salvar os dados de um registro de formulário pela Navegação de Documentos ou por movimentações Workflow se deseja salvar os dados do registro de formulário em uma forma externa. Por exemplo, ao criar o registro de formulário, enviar os dados do mesmo para um Webservice de outro produto.
function afterSaveCard(companyId, formId, cardId, versionId, cardData){ } |
Sendo os parâmetros:
Propriedade | Descrição | Tipo |
companyId | Código da Empresa | int |
formId | Código do Formulário | int |
cardId | Código do Registro de Formulário | int |
versionId | Versão do Registro de Formulário | int |
cardData | Dados do Registro de Formulário | Hashmap <String, String> |
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 formulário ou um registro de formulário é eliminado da lixeira.
function afterSaveCard(companyId, formId, cardId, versionId, cardData){ } |
Sendo os parâmetros:
Propriedade | Descrição | Tipo |
companyId | Código da Empresa | int |
cardId | Código do Registro de Formulário | int |
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); } |
Utilizado quando ao acompanhar algum conteúdo se deseja recuperar informações do registro e usar antes da ação de "acompanhar". Por exemplo, ao acompanhar um documento, é possível recuperar suas informações e usá-las em um dataset.
function beforeWatchContent(companyId, watchDTO){ } |
Sendo os parâmetros:
Propriedade | Descrição | Tipo |
companyId | Código da Empresa | int |
watchDTO | Dados do registro | WatchDTO |
function beforeWatchContent(companyId, watchDTO){ if(watchDTO.getSocialWatchType() == "DOCUMENT"){ var objClass = "com.totvs.technology.social.document.6"; var objClass = watchDTO.getObjectClass(); var patt = new RegExp( /\d+/) ; var documentId = patt.exec(objClass) ; var documentVersion = watchDTO.getObjectId(); var doc = getValue("WKDocument"); var company = companyId; var ds ; try { var c1 = DatasetFactory.createConstraint( "allocatedDocumentPK.companyId", company, company, ConstraintType.MUST); var c2 = DatasetFactory.createConstraint("allocatedDocumentPK.sourceDocument",documentId,documentId, 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("Erro ao tentar recuperar o documento em CheckOut: " + e.message); } if(ds!=null && ds.rowsCount>0){ throw "Sua solicitação de notificação foi negada, pois o documento está em checkout." ; } } } |
Utilizado quando ao acompanhar algum conteúdo se deseja recuperar informações do registro e usar após a ação de "acompanhar". Por exemplo, ao acompanhar um post, é possível recuperar suas informações e usá-las para informar o usuário sobre o autor do post.
function afterWatchContent(companyId, watchDTO){ } |
Sendo os parâmetros:
Propriedade | Descrição | Tipo |
companyId | Código da Empresa | int |
watchDTO | Dados do registro | WatchDTO |
function afterWatchContent(companyId, watchDTO){ if(watchDTO.getSocialWatchType() == "POST"){ throw "O usuário "+watchDTO.getUserAlias()+" vai ser notificado sobre o post " + watchDTO.getText() + " do autor " + watchDTO.getPostAuthor() ; } } |
Utilizado quando ao deixar de acompanhar algum conteúdo se deseja recuperar informações do registro e usar antes da ação de "deixar de acompanhar". Por exemplo, ao tentar deixar de acompanhar uma comunidade, é possível decidir se o usuário pode deixar de acompanhá-la.
function beforeUnwatchContent(companyId, watchDTO){ } |
Sendo os parâmetros:
Propriedade | Descrição | Tipo |
companyId | Código da Empresa | int |
watchDTO | Dados do registro | WatchDTO |
function beforeUnwatchContent(companyId, watchDTO){ if(watchDTO.getSocialWatchType() == "COMMUNITY"){ throw "Você não pode deixar de ser notificado sobre a comunidade " + watchDTO.getDescription() ; } } |
Utilizado quando ao deixar de acompanhar algum conteúdo se deseja recuperar informações do registro e usar após a ação de "deixar de acompanhar". Por exemplo, ao deixar de acompanhar um post, é possível recuperar suas informações e informar o usuário que aquele post possui muitos seguidores.
function afterUnwatchContent(companyId, watchDTO){ } |
Sendo os parâmetros:
Propriedade | Descrição | Tipo |
companyId | Código da Empresa | int |
watchDTO | Dados do registro | WatchDTO |
function afterUnwatchContent(companyId, watchDTO){ if(watchDTO.getSocialWatchType() == "POST" && watchDTO.getNumberWatchers() < 3 ){ log.erro("O post \"" + watchDTO.getText() + "\" do autor " + watchDTO.getPostAuthor() + " deixou de ser polemico" ) } } |
Este evento é disparado sempre antes da efetivação do compartilhamento de um objeto social.
OBS: Pode-se alterar a mensagem de compartilhamento passando uma String para o método setText( <valor> ) do objeto "share". |
---|
function beforeSocialShare(companyId, share){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
share | objeto de socialização | Customização de Eventos |
function beforeSocialShare(companyId, share){ var lastUpd = share.getSociable().getLastUpdateDate().getTime(); log.info("lastUpd: " + lastUpd); var daysAgo = new Date(); daysAgo.setDate(daysAgo.getDate()-3); log.info("daysAgo: " + daysAgo); if (lastUpd < oneMonthAgo) { throw "You could not share old socials (more than 3 days old)"; } } |
Esse evento é disparado sempre após a efetivação de um compartilhamento.
function afterSocialShare(companyId, share){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
share | objeto de socialização | Customização de Eventos |
function afterSocialShare(companyId, share){ log.info(share.getUser() + " has shared the sociable " + share.getSociable().getId() + " with text " + share.getText()); } |
Esse evento é disparado sempre antes da efetivação de um comentário.
OBS: Pode-se alterar o conteúdo do comentário passando uma String para o método setText( <valor> ) do objeto "comment". |
---|
function beforeSocialComment(companyId, comment){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
comment | objeto de comentário | Customização de Eventos |
function beforeSocialComment(companyId, comment){ if (comment.getSociable().getNumberLikes() < 1) { throw "You can not comment a post that was not liked."; } } |
Esse evento é disparado sempre após a efetivação de um comentário.
function afterSocialComment(companyId, comment){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
comment | objeto de comentário | Customização de Eventos |
function afterSocialComment(companyId, comment){ log.info(comment.getUser() + " has done the comment " + comment.getText()); } |
Esse evento é disparado sempre antes da efetivação de um post.
OBS: Pode-se alterar o conteúdo da publicação passando uma String para o método setText( <valor> ) do objeto "post". |
---|
function beforeSocialPost(companyId, post){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
post | Objeto que representa a publicação | Customização de Eventos |
function beforeSocialPost(companyId, vo){ if(vo.getText().indexOf(" fluid ") > -1) { vo.setText(vo.getText().replace( " fluid ", " fluig ")); } } |
Esse evento é disparado sempre após a efetivação de um comentário.
function beforeSocialPost(companyId, post){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
post | objeto de post | Customização de Eventos |
function afterSocialPost(companyId, post){ if (post.getText().toLowerCase().indexOf("#minhacampanha") > -1) { log.info(post.getUser() + " has published a content."); } } |
Esse evento é disparado sempre antes da efetivação de uma remoção de um post.
function beforeSocialPostRemove(companyId, post){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
post | objeto de post | Customização de Eventos |
function beforeSocialPostRemove(companyId, post){ if (post.getText().toLowerCase().indexOf("#important") > -1) { throw "You cannot remove a post marked as important."; } } |
Esse evento é disparado sempre após a efetivação de uma remoção de um post.
function beforeSocialPostRemove(companyId, post){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
post | objeto de post | Customização de Eventos |
function afterSocialPostRemove(companyId, post){ log.info(post.getUser() + " has removed the post " + post.getSociable().getId()); } |
O evento é disparado quando um Sociable é denunciado porém antes que a ação seja efetivada.
Exemplo de uso:
function beforeSocialDenounce(companyId, denounce){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
denounce | objeto de post | Customização de Eventos |
function beforeSocialDenounce(companyId, denounce){ if (denounce.getSociable().getText().toLowerCase().indexOf("#cipa") > -1) { throw "You cannot denounce posts about CIPA."; } } |
O evento é disparado após a efetivação de uma ação de denúncia de um sociable.
function afterSocialDenounce(companyId, denounce){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
denounce | objeto de post | Customização de Eventos |
Exemplo Prático
Registrar em log as denúncias efetuadas para auditoria.
function afterSocialDenounce(companyId, denounce){ log.info(denounce.getUser() + " has denounced the sociable " + denounce.getSociable().getId() + " with comment " + denounce.getText()); } |
O evento é disparado antes de ser efetivada uma ação de "curtir" de um sociable.
function beforeSocialLike(companyId, like){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
like | Objeto com dados do sociable curtido | Customização de Eventos |
function beforeSocialLike(companyId, like){ if (like.getSociable().getText().toLowerCase().indexOf("#greve") > -1) { throw "You can not like a post that has this type of comment."; } } |
O evento é disparado após a efetivação de uma ação de "curtir" de um sociable.
function afterSocialLike(companyId, like){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
like | Objeto com dados do sociable curtido | Customização de Eventos |
Exemplo Prático
Registrar em log para auditoria todas as publicações curtidas.
function afterSocialLike(companyId, like){ log.info(like.getUser() + " has liked the " + like.getSociable().getUrl()); } |
O evento é disparado antes de ser efetivada uma ação de "descurtir" de um sociable.
function beforeSocialUnlike(companyId, unlike){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
unlike | Objeto com dados do sociable descurtido | Customização de Eventos |
function beforeSocialUnlike(companyId, unlike){ throw "You can not unlike a post."; } |
O evento é disparado após a efetivação de uma ação de "descurtir" de um sociable.
function afterSocialUnlike(companyId, unlike){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
unlike | Objeto com dados do sociable descurtido | Customização de Eventos |
Exemplo Prático
Registrar em log para auditoria todas as publicações que deixaram de ser apoiadas.
function afterSocialUnlike(companyId, unlike){ log.info(unlike.getUser() + " has unliked the " + unlike.getSociable().getUrl()); } |
O evento é disparado antes da efetivação da remoção de um comentário de um sociable.
function beforeSocialCommentRemove(companyId, comment){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
comment | Objeto que contém as informações do comentário | Customização de Eventos |
Exemplo Prático: Evitar que usuários removam seus comentários em uma publicação de campanha interna da empresa.
function beforeSocialCommentRemove(companyId, comment){ if (comment.getSociable().getText().toLowerCase().indexOf("#bolao") > -1) { throw "You cannot change your guess."; } } |
O evento é disparado após a efetivação da ação de remover o comentário de um sociable.
function afterSocialCommentRemove(companyId, comment){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
comment | Objeto que contém as informações do comentário | Customização de Eventos |
Exemplo Prático
Registrar em log para auditoria todos os comentários com a hashtag "protesto".
function afterSocialCommentRemove(companyId, comment){ if (comment.getText().toLowerCase().indexOf("#protesto") > -1) { log.info(comment.getUser() + " has removed the comment " + comment.getText() + " of the sociable " + comment.getSociable().getId()); } } |
O evento é disparado antes da efetivação da participação em uma comunidade.
function beforeCommunityParticipation(companyId, relation){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
relation | Objeto que contém as informações de participação | Customização de Eventos |
function beforeCommunityParticipation(companyId, relation){ if (relation.getCommunity().getAlias() == "economia") { throw "Comunidade temporariamente indisponível!"; } log.info("beforeCommunityParticipation Social Alias: " + relation.getSocial().getAlias() + " Community Alias: " + relation.getCommunity().getAlias()); } |
O evento é disparado após a efetivação da participação em uma comunidade.
function afterCommunityParticipation(companyId, relation){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
relation | Objeto que contém as informações de participação | Customização de Eventos |
function afterCommunityParticipation(companyId, relation){ log.info("afterCommunityParticipation Social Alias: " + relation.getSocial().getAlias() + " Community Alias: " + relation.getCommunity().getAlias()); } |
O evento é disparado antes da efetivação da exclusão de participação em uma comunidade.
function beforeCommunityLeave(companyId, relation){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
relation | Objeto que contém as informações de participação | Customização de Eventos |
function beforeCommunityLeave(companyId, relation){ if (relation.getCommunity().getAlias() == "eventos") { throw "Não é permitido deixar essa comunidade"; } log.info("beforeCommunityLeave Social Alias: " + relation.getSocial().getAlias() + " Community Alias: " + relation.getCommunity().getAlias()); } |
O evento é disparado após a efetivação da exclusão de participação em uma comunidade.
function afterCommunityLeave(companyId, relation){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
relation | Objeto que contém as informações de participação | Customização de Eventos |
function afterCommunityLeave(companyId, relation){ log.info("afterCommunityLeave Social Alias: " + relation.getSocial().getAlias() + " Community Alias: " + relation.getCommunity().getAlias()); } |
O evento é disparado antes da efetivação de seguir uma pessoa.
function beforeSocialFollow(companyId, follow){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
follow | Objeto que contém as informações de seguir | Customização de Eventos |
function beforeSocialFollow(companyId, follow){ log.info("beforeSocialFollow Social Alias: " + follow.getSocial().getAlias() + " Followed Alias: " + follow.getFollowed().getAlias()); } |
O evento é disparado após a efetivação de seguir uma pessoa.
function afterSocialFollow(companyId, follow){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
follow | Objeto que contém as informações de seguir | Customização de Eventos |
function afterSocialFollow(companyId, follow){ log.info("afterSocialFollow Social Alias: " + follow.getSocial().getAlias() + " Followed Alias: " + follow.getFollowed().getAlias()); } |
O evento é disparado antes da efetivação de deixar de seguir uma pessoa.
function beforeSocialUnfollow(companyId, follow){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
follow | Objeto que contém as informações de seguir | Customização de Eventos |
function beforeSocialUnfollow(companyId, follow){ log.info("beforeSocialUnfollow Social Alias: " + follow.getSocial().getAlias() + " Followed Alias: " + follow.getFollowed().getAlias()); } |
O evento é disparado após a efetivação de deixar de seguir uma pessoa.
function afterSocialUnfollow(companyId, follow){ } |
Parâmetros da função
Propriedade | Descrição | Tipo |
---|---|---|
companyId | Código da Empresa | int |
follow | Objeto que contém as informações de seguir | Customização de Eventos |
function afterSocialUnfollow(companyId, follow){ log.info("afterSocialUnfollow Social Alias: " + follow.getSocial().getAlias() + " Followed Alias: " + follow.getFollowed().getAlias()); } |
Para interferir no envio de um e-mail padrão do Fluig, deve ser utilizado o evento global onNotify, que é disparado no momento em que qualquer um dos e-mails do Fluig é enviado. Nesse evento, podem ser feitas alterações como, por exemplo, adicionar outros destinatários ao e-mail, modificar os valores dos parâmetros utilizados no template de e-mail, etc.
Abaixo se encontra um exemplo de como implementar esse evento:
function onNotify(subject, receivers, template, params) { if (template.match("TPLDOCUMENT_APPROVAL_PENDING") != null) { receivers.add("[email protected]"); } } |
A partir da versão 1.3.3 do Fluig, recomenda-se fazer a validação do template utilizando template == "TPLDOCUMENT_APPROVAL_PENDING" ao invés da função match(), evitando assim redundâncias na customização, pois o match() pode retornar como válido para mais de um template em casos como TPLNEW_TASK e TPLNEW_TASK_POOL_GROUP. |
O evento onNotify está disponível na lista de eventos globais. Ao selecionar esse evento na lista de eventos disponíveis, a assinatura da função acima já será preenchida automaticamente. Este evento disponibiliza os seguintes parâmetros:
Parâmetro | Descrição |
---|---|
subject | É o assunto do e-mail. A alteração desta variável irá implicar que todos os usuários recebam o e-mail com o novo assunto configurado. Exemplo de utilização: subject.add("ASSUNTO"); |
receivers | Lista de e-mails destinatários. Também é possível adicionar outros e-mails, de usuários que não participam do processo. Inclusive, podem ser adicionados e-mails de usuários que não estão cadastrados no Fluig, caso seja necessário notificar uma pessoa que não tenha acesso ao sistema. |
template | Permite validar qual tipo de e-mail está sendo enviado (por exemplo, template de documento em aprovação, documento expirando, etc). Com base nessa variável podemos distinguir quais e-mails queremos customizar. É recomendável que sempre seja verificado o código do template, para evitar que ocorram alterações em outros tipos de e-mail, que não necessitariam de customização. |
params | É um mapa de dados que permite alterar/incluir parâmetros para que sejam apresentados no e-mail. O nome dos parâmetros informados nesse mapa devem ser os mesmos que são utilizados dentro do arquivo de template. |
No exemplo que foi apresentado acima está sendo validado se o template é o "TPLDOCUMENT_APPROVAL_PENDING" (que corresponde a documento pendente de aprovação). Em caso positivo, um novo e-mail será adicionado na lista de destinatários. Ou seja, além do responsável pela aprovação, outra pessoa será notificada, recebendo uma cópia do e-mail. Como está sendo validado o código do template, os demais tipos de e-mail não serão afetados.
Os templates podem ser consultados dentro do diretório do volume, em: <VOLUME>\templates\tplmail. Se for necessário adicionar algum parâmetro no e-mail padrão, os templates podem ser editados diretamente nesse diretório.
|
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.
Este objeto representa o 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 |
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 Fluig. | 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 usuário 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 caminho físico onde o documento está armazenado. | 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: 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çã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 usuário 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 usuário 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 |
var doc = getValue("WKDocument"); log.info("Número do documento: "+ doc.getDocumentId() + " - Versão: "+ doc.getVersion()); |
Este objeto 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 usuário ou o código do grupo que está aprovando este documento. É possível saber se vai retornar um usuário ou um grupo pelo tipo de aprovação. | String |
getApproverType() | Retorna o tipo da aprovação, onde: 0 à Usuário 1 à Grupo | int |
getLevelId() | Retorna o nível de aprovação, no caso de aprovação em níveis. | int |
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 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 usuário ou o código do grupo que está na segurança deste documento. É possível saber se vai retornar um usuário 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 à Usuário; 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údo. | boolean |
getSecurityLevel() | Retorna no nível de permissão/restrição, onde: -1 à 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ção. | int |
getSecurityVersion() | Retorna se ele utiliza a segurança deste versão nas demais. | boolean |
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"; } } } |
Este objeto representa os documentos relacionados 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 |
getRelatedDocumentId() | Retorna o número do documento que está relacionado ao documento publicado. | int |
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()); } } |
Este objeto representa as notificações de acompanhamento de comentários e suas propriedades, na tabela abaixo consta mais informações sobre ele:
Função | Descrição da Função | Tipo do Retorno |
getEntityId() | Retorna o código do Conteúdo. | String |
getUserId() | Retorna o código do usuário. | String |
getUserAlias() | Retorna o alias do usuário. | String |
getSociableId() | Retorna ocódigo sociable. | String |
getCreationDate() | Retorna a data de criação. | String |
getLastUpdateDate() | Retorna a data da última atualizaçã. | String |
getNumberComments() | Retorna o número de comentários. | String |
getNumberLikes() | Retorna o número de apoios. | String |
getNumberShares() | Retorna o número de compartilhamentos. | String |
getNumberWatchers() | Retorna o número de acompanhamentos. | String |
getNumberDenouncements() | Retorna o número de denúncias. | String |
getSocialWatchType() | Retorna o tipo (social) | String |
getPostAuthor() | Retorna o autor do conteúdo. | String |
getTags() | Retorna as tags. | String |
getText() | Retorna o texto. | String |
getDescription() | Retorna a descrição. | String |
getObjectClass() | Retorna a classe do objeto. | String |
getObjectId() | Retorna o objectId. | String |
getThumbURL() | Retorna a url do thumb | String |
SocialPostEventVO | ||
Propriedade / Método | Descrição | Tipo / Retorno |
---|---|---|
getText() | texto do post | String |
getUser() | alias do usuário que está postando | String |
getVisibility() | visibilidade do post | String |
getPostId() | identificador do post | String |
getCreationDate() | data de criação do post | String |
getLastUpdateDate() | data de ultima atualização do post | String |
getSociable() | objeto sociable relacionado a esse post. Ex: Imagem, Vídeo, Artigo, etc... | Customização de Eventos |
getSocial() | objeto social onde o post foi feito. Pode ser timeline de um usuario ou um comunidade | Customização de Eventos |
*getAttributes() | Atributos do Analytics em formato de Lista de Strings. Limite de 3 itens | List<String> |
*getFacts() | Fatos dos atributos do Analytics em formato de Lista de Strings. Limite de 3 itens | List<String> |
customData | Mapa em formato JSON onde pode-se persistir dados extras da publicação | Map JSON |
*Somente enviado no evento beforSocialPost e afterSocialPost, esses valores não são persistidos no Fluig
SociableEventVO | ||
Propriedade / Método | Descrição | Tipo / Retorno |
---|---|---|
getId() | identificador do objeto | String |
getCreationDate() | data de criação do objeto | String |
getLastUpdateDate() | ultima atualização do objeto | String |
getNumberLikes() | quantidade de curtidas | String |
getNumberShares() | quantidade de compartilhamentos | String |
getNumberComments() | quantidade de comentários | String |
getNumberDenouncements() | quantidade de denúncias | String |
getNumberWatchers() | quantidade de acompanhamentos | String |
getTags() | nomes marcadores | String |
getUrl() | endereço do objeto | String |
getSociableType() | tipo do objeto social | String |
getRemoved() | informa se o objeto foi removido | String |
*getPostAuthor() | retorna o alias do autor da publicação que foi comentada | String |
*getText() | retorna o texto da publicação que foi comentada | String |
**getDescription() | Nome do objeto comentado | String |
**getThumbURL() | url de ícone do objeto comentado. | String |
getSocial() | local aonde o comentário foi efetuado | SocialEvent |
*retornados apenas quando o comentário é sobre um post.
**retornado para os comentários de documentos e etc.
SocialEventVO | ||
Propriedade / Método | Descrição | Tipo / Retorno |
---|---|---|
getId() | identificador do objeto | String |
getCreationDate() | data de criação do objeto | String |
getLastUpdateDate() | ultima atualização do objeto | String |
getAlias() | apelido do objeto social | String |
getName() | nome do objeto social | String |
getDescription() | descrição do objeto social | String |
getType() | tipo do objeto social | String |
getState() | status do objeto social | String |
getHidden() | informa se o objeto é oculto | String |
getPrivateContent() | informa se o conteúdo é privado | String |
getApprovalRequired() | informa se aprovação é requerida | String |
getCustomPage() | informação de página customizada | String |
SocialShareEventVO | ||
Propriedade / Método | Descrição | Tipo / Retorno |
---|---|---|
getSociable() | objeto sendo compartilhado | Customização de Eventos |
getSocialPlace() | objeto que recebe o compartilhamento | Customização de Eventos |
getUser() | alias do usuario que compartilha | String |
getText() | texto informado no compartilhamento | String |
getType() | tipo do objeto | String |
SocialCommentEventVO | ||
Propriedade / Método | Descrição | Tipo / Retorno |
---|---|---|
getSociable() | objeto sendo compartilhado | Customização de Eventos |
getUser() | alias do usuário que comenta | String |
getText() | texto informado no comentário | String |
getCommentId() | id do comentário | String |
SocialDenounceEventVO | ||
Propriedade / Método | Descrição | Tipo / Retorno |
---|---|---|
getSociable() | objeto sendo compartilhado | Customização de Eventos |
getUser() | alias do usuário que comenta | String |
getText() | texto informado no comentário | String |
getType() | Tipo de denúncia | String |
SocialLikeEventVO | ||
Propriedade / Método | Descrição | Tipo / Retorno |
---|---|---|
getSociable() | objeto sendo compartilhado | Customização de Eventos |
getUser() | alias do usuário que comenta | String |
SocialCommunityRelationEventVO | ||
Propriedade / Método | Descrição | Tipo / Retorno |
---|---|---|
getSocial() | Social relacionado à comunidade | Customização de Eventos |
getCommunity() | Social que representa a Comunidade | Customização de Eventos |
SocialFollowEventVO | ||
Propriedade / Método | Descrição | Tipo / Retorno |
---|---|---|
getSocial() | Social que seguirá | Customização de Eventos |
getFollowed() | Social que está sendo seguido | Customização de Eventos |
A partir dos eventos é possível executar ações no Fluig.
As ações disponíveis são as mesmas da API Pública (chamadas REST) e são disparadas através de um objeto consumer.
Para obter uma instância de consumer é necessário solicitar ao objeto de ambiente oauthUtil executando o método getNewAPIConsumer ou getNewAPIConsumerAsCurrentUser.
Utilizada para solicitar um objeto de acesso com autenticação por usuário da aplicação.
Utilizada para solicitar um objeto de acesso com autenticação pelo usuário logado.
IMPORTANTE: Para poder utilizar esse método você deve marcar na página do usuário aplicativo a opção "Pode agir como usuário logado em eventos customizados"
O usuário da aplicação utiliza o modo Impersonate como forma de identificação na autenticação do acesso. Esse modo Impersonate só é permitido através dos eventos customizados e não fora dele.
Para ambos os métodos descritos acima, utilizar os seguintes parâmetros:
Essas informações de parâmetros são fornecidas pelo Fluig em Painel de Controle, na aba WCM, item Oauth Provider.
Esse método realiza uma chamada GET na API Publica, passando como argumento uma URI válida da API (ver documentação da API).
Ex: consumer.get("/public/social/community/comunidade1");
Esse método realiza uma chamada POST na API Publica, passando como argumento uma URI válida da API (ver documentação da API) e os dados enviados em formato JSON.
Ex: consumer.post("/public/social/post/create/with/upload", "{\"text\":\"Post criado via evento\",\"visibility\":\"PUBLIC\"}");
Nesse exemplo, a mensagem "Post criado via evento" é postada no mural
function beforeSocialPost(companyId, vo) { if (vo.getSocial().getType() == "USER" && vo.getUser() != "admin") { var consumer = oauthUtil.getNewAPIConsumer("my_app_key", "my_app_secret", "605da7f2-d087-4f4b-903e-486df9563956", "2b192950-fe0c-4211-a4bf-5962c18432d85c077dfb-aa51-45a0-ab43-822a680070ab"); var userData = JSON.parse(consumer.get("/public/social/user/" + vo.getUser())); if (userData.numberFollowers == 0) { throw "Voce deve ser seguido por alguem para poder postar em sua timeline."; } } } |
function afterDocumentPublisher(){ var doc = getValue("WKDocument"); var user = getValue("WKUser"); var msgPost = "Novo documento: "+ doc.getDocumentId() + " - Versão: "+ doc.getVersion(); log.info(msgPost); var jsonContent = "{\"text\":\"" + msgPost + "\",\"visibility\":\"PUBLIC\"}"; log.info(jsonContent); var consumer = oauthUtil.getNewAPIConsumerAsCurrentUser("myapp", "myappsecret", "32718929-568b-4a64-9f67-bbeadf4c1fc3", "eff7b746-384b-43ba-be3a-aed14da822a4b8352de0-62be-456e-a0d8-ab5c00a745bc"); consumer.post("/public/social/post/create", jsonContent); } |
É possível enviar dados ao analytics a partir dos eventos de customização.
Esse dados recebidos pelo evento não são persistidos no Fluig mas podem ser modificados antes de serem enviados ao Analytics.
Esses valores são transmitidos no objeto SocialPostEventVO
analyticsUtil.updatePostData(String postId, String[] attributes, String[] facts); |
function afterSocialPost(companyId, post){ analyticsUtil.updatePostData(post.getPostId(), post.getAttributes(), post.getFacts()); } |
O Fluig 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 Fluig, 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:
@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. |
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 Fluig, conforme tabela abaixo:
Objeto | Descrição | Tabela no BD |
Icon | Ícone | ICONE |
Topic | Assunto | ASSUNTO |
Shortcut | Segurança de Menu | MENU_ICONE |
LogAccess | Log de Acesso | LOG_ACCESS |
ColleagueReplacement | Substituto | COLAB_SUBSTTO |
Application | Aplicativo | APLICATIVO |
ProgressLib | Ambiente Progress | AMBIEN_PROGRESS |
GlobalCalendar | Feriado | CALEND_GLOBAL |
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:
@MessageDriven(mappedName = "custom/DocumentListener", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/wdkAbstract")}) |
O 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. |
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:
private Map<String, Object> decoderMap(byte[] array) { if(array.length>0){ ByteArrayInputStream bos = new ByteArrayInputStream(array); ObjectInputStream p = new ObjectInputStream(bos); Object docObject = p.readObject(); try{ Map<String, Object> map = (Map<String, Object>) docObject; return map; }catch(java.lang.ClassCastException e){ e.printStackTrace(); } } return null; } |
package com.totvs.fluig.custom.dm; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.util.Enumeration; import java.util.Iterator; import java.util.Map; import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.MapMessage; import javax.jms.Message; import javax.jms.MessageListener; @MessageDriven(mappedName = "custom/DocumentListener", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/wdkAbstract") }) public class AbstractListenerMessageBean implements MessageListener { @Override public void onMessage(Message message) { try { System.out.println("==============Abstract Listener===================="); System.out.println("Message received: " + message.getJMSMessageID()); if (message instanceof MapMessage) { MapMessage mm = (MapMessage) message; @SuppressWarnings("unchecked") Enumeration<String> es = mm.getMapNames(); while (es.hasMoreElements()) { String prop = es.nextElement(); System.out.println(prop + ": " + mm.getObject(prop)); if(prop.equalsIgnoreCase("mapNewVersion") || prop.equalsIgnoreCase("mapOldVersion")){ Map<String, Object> m = decoderMap(mm.getBytes(prop)); Iterator it = m.entrySet().iterator(); while (it.hasNext()) { Map.Entry e = (Map.Entry)it.next(); System.out.println(prop + " - " + e.getKey() + ": " + e.getValue()); } } } } System.out.println("==========Fim Abstract Listener==============="); } catch (Exception e) { e.printStackTrace(); } } private Map<String, Object> decoderMap(byte[] array) throws IOException, ClassNotFoundException{ if(array.length>0){ ByteArrayInputStream bos = new ByteArrayInputStream(array); ObjectInputStream p = new ObjectInputStream(bos); Object docObject = p.readObject(); try{ Map<String, Object> map = (Map<String, Object>) docObject; return map; }catch(java.lang.ClassCastException e){ e.printStackTrace(); } } return null; } } |