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.

...

Bloco de código
function afterProcessFinish(processId){
var func = { run: function(){
a();
}
};
var r = new java.lang.Runnable(func);
var t = new java.lang.Thread(r);
t.start();
log.info("Iniciei a thread");
return;
}
function a(){
try {
var atividade = getValue("WKNumState");
var user = getValue("WKUser");
var processo = getValue("WKNumProces");
log.info("########## Atividade: " + atividade);
log.info("########## inicio webservice workflow");
var workflow = ServiceManager.getService("WorkflowEngineService");
var serviceHelper = workflow.getBean();
var serviceLocator = serviceHelper.instantiate("com.datasul.technology.webdesk.workflow.ws.WorkflowEngineServiceServiceLocator");
var service = serviceLocator.getWorkflowEngineServicePort();
log.info("########## carregou serviço workflow");
log.info("########## Carrega Colaboradores do segundo processo");
var stringArray = service.getAvailableUsersStart("adm", "adm", 1, "process2", 0, 0);
var field1 = serviceHelper.instantiate("com.datasul.technology.webdesk.workflow.ws.KeyValueDto");
field1.setKey("nome");
field1.setValue("valorNome");
var field2 = serviceHelper.instantiate("com.datasul.technology.webdesk.workflow.ws.KeyValueDto");
field2.setKey("cid");
field2.setValue("valorCidade");
var resultArr = serviceHelper.instantiate("com.datasul.technology.webdesk.workflow.ws.KeyValueDtoArray");
resultArr.setItem(new Array(field1, field2));
log.info("########## Inicia StartProcess");
var userArray = serviceHelper.instantiate("net.java.dev.jaxb.array.StringArray");
userArray.setItem(new Array(user));
log.info("########## Usuario: " + userArray.getItem(0));
try {
var ret = service.startProcessClassic("adm", "adm", 1, "process2", 2, userArray , "webservice chamada", "adm", false, null,resultArr, null, true);
} catch(e) {
log.info("########## Erro startProcess: " + e);
}
} catch(x) {
log.info("########## Erro Process: " + x);
}
}

 

Tratamento de Excessões

As exceções podem ser tratadas nos seguintes eventos: beforeStateEntry, beforeTaskSave e beforeCancelProcess. O tratamento da exceção no evento beforeStateEntry pode ser utilizado somente na inicialização de solicitações, pois ele impede que a solicitação seja iniciada. O tratamento da exceção no evento beforeTaskSave pode ser utilizado somente se a solicitação já estiver inicializada. Abaixo segue os modelos para utilização em cada um dos eventos:

...

AssociadoPermite compor lógicas complexas de atribuição por intermédio da associação de vários mecanismos.
Campo FormulárioPermite atribuir tarefas ao colaborador informado em um campo do formulário do processo.
Executor AtividadePermite selecionar os colaboradores que executaram uma atividade anterior.
GrupoPermite filtrar apenas os colaboradores que façam parte de um determinado grupo.
Grupos ColaboradorPermite filtrar apenas os colaboradores que pertençam a um dos grupos do colaborador corrente, ou do colaborador que iniciou o processo (solicitante). Também permite filtrar apenas os colaboradores cujo grupo de trabalho seja o mesmo do colaborador (corrente ou solicitante).
PapelPermite filtrar apenas os colaboradores que possuam um determinado papel no Workflow.
Pool GrupoPermite atribuir tarefas a um grupo de colaboradores e não apenas a um colaborador. Assim, qualquer um dos colaboradores deste grupo pode assumir as tarefas para completá-las.
Pool PapelPermite atribuir tarefas a um papel e não apenas a um colaborador. Assim, qualquer um dos colaboradores neste papel pode assumir as tarefas para completá-las.
UsuárioPermite atribuir tarefas a um colaborador específico.

 

Como Criar Um Mecanismo de Atribuição

O mecanismo de atribuição geralmente é composto de duas partes, a tela de configuração e o script de resolução do mecanismo de atribuição.

...

Deck of Cards
id3
Card
id3
labelPasso 1

Para criar um mecanismo de atribuição basta acessar o “Painel de Controle”, na opção “Workflow” e clicar sobre “Mecanismos de Atribuição”. A seguinte tela será apresentada:

A tela apresenta todos os mecanismos de atribuição padrão do ECM e também os mecanismos customizados.

Card
id3
labelPasso 02

Para criar um novo mecanismo de atribuição clique sobre o botão “Adicionar”, então a seguinte tela será apresentada:

O mecanismo de atribuição deverá possuir obrigatoriamente seu código, o nome e a descrição da configuração. A tela de configuração é opcional, mas caso for utilizá-la, deve-se obrigatoriamente importar o componente “AssignmentSelectedEvent.swc” que fica dentro do diretório de instalação do ECM (Ex: <INSTALL_ECM>\server\default\deploy\Webdesk3EE.ear) dentro do pacote EAR existe um pacote “ecm-web.war”, abra o arquivo e copie o SWC para o seu projeto e importe como biblioteca.

Card
id3
labelPasso 3

Após, sua tela deve estender o módulo WebdeskModule, veja um exemplo de tela abaixo:

Bloco de código
<?xml version="1.0" encoding="utf-8"?>
<module:WebdeskModule xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:module="com.datasul.technology.webdesk.foundation.module.*"
creationComplete="{init();}">
<module:states> <mx:State name="blocked"> <mx:SetProperty target="{this}" name="enabled" value="false"/> </mx:State> </module:states>
<mx:Script>
<![CDATA[
import com.datasul.technology.webdesk.workflow.assignment.event.AssignmentSelectedEvent;
import com.datasul.technology.webdesk.dm.view.event.CloseWindowEvent;
import mx.collections.ArrayCollection;
[Bindable]
private var arr:ArrayCollection = new ArrayCollection([
{value:"asd1",label:"Informática"},
{value:"asd2",label:"RH"},
{value:"asd3",label:"Produto"}]);
private function init():void {
if (super.xmlFromDatabase != null) {
var xml:XML = new XML(super.xmlFromDatabase);
var area:String = String(xml.area);
this.tiNome.text = String(xml.nome);
for each (var current:Object in this.arr) {
if (current.value == area) {
this.cbArea.selectedItem = current;
break;
}
}
}
}
private function saveMecan():void {
var event:AssignmentSelectedEvent = new AssignmentSelectedEvent();
event.xmlString = "<Custom>" +
" <nome>"+this.tiNome.text+"</nome>" +
" <area>"+this.cbArea.selectedItem.value+"</area>" +
"</Custom>";
this.dispatchEvent(event);
this.closeWindow();
}
private function closeWindow():void {
this.dispatchEvent(new CloseWindowEvent());
}
]]>
</mx:Script>
<mx:Form>
<mx:FormItem label="Nome">
<mx:TextInput id="tiNome" width="200"/>
</mx:FormItem>
<mx:FormItem label="Área">
<mx:ComboBox id="cbArea" dataProvider="{arr}"></mx:ComboBox>
</mx:FormItem>
<mx:FormItem direction="horizontal" width="100%">
<mx:Button label="Salvar" click="{saveMecan()}"/>
<mx:Button label="Fechar" click="{closeWindow()}"/>
</mx:FormItem>
</mx:Form>
</module:WebdeskModule>
Card
id3
labelPasso 4

A tela de configuração deverá montar o XML que consiste da configuração do mecanismo de atribuição. Na resolução de uma atividade do processo o XML de configuração será enviado ao script de descrição da configuração – é o último campo da tela. Exemplo baseado na tela acima:

Bloco de código
function resolve(process,colleague,configXML){
var newXML = new XML(configXML);
var userList = new java.util.ArrayList();
 
if (newXML.area.toString()=="asd1") { 
userList.add('adm'); 
} else if (newXML.area.toString()=="asd2") {
userList.add('1'); 
} else {
userList.add('10'); 
} 
return userList;
}

 

 

 

 

 

OBS: É possível acessar Datasets e WebServices apartir da função.

Além do XML o script também recebe como parâmetros o código do processo e o usuário corrente. Por fim, o script de configuração retorna a lista de usuários e o fluxo de saída da atividade é selecionado.

Para persistir o XML de configuração criado pela tela basta lançar o evento AssignmentSelectedEvent e atribuir o XML de configuração na propriedade “xmlString”.

Dica: caso a compilação normal pela GUI de desenvolvimento não esteja efetuando as importações corretamente, segue sugestão de compilação do projeto:

mxmlc -debug=false -optimize=true -warnings=false -load-config flex-config-mxmlc.xml -source-path=. <ARQUIVO>.mxml -output <ARQUIVO>.swf

Arquivo FLEX-CONFIG-MXMLC.XML:

Bloco de código
<?xml version="1.0" encoding="utf-8"?>
<flex-config xmlns="http://www.adobe.com/2006/flex-config">
<metadata>
<title>TOTVS | ECM</title>
<language>EN</language>
</metadata>
<compiler>
<fonts>
<local-fonts-snapshot>C:/Arquivos de programas/Adobe/Flex Builder 3 Plug-in/sdks/2.0.1/frameworks/localFonts.ser</local-fonts-snapshot>
</fonts>
<!-- list of SWC files or directories that contain SWC files -->
<library-path>
<path-element>C:/Arquivos de programas/Adobe/Flex Builder 3 Plug-in/sdks/2.0.1/frameworks/libs</path-element>
<path-element>C:/Arquivos de programas/Adobe/Flex Builder 3 Plug-in/sdks/2.0.1/frameworks/locale/en_US</path-element>
<path-element>AssignmentSelectedEvent.swc</path-element>
</library-path>
<debug>true</debug>
</compiler>
<use-network>true</use-network>
</flex-config>

Por fim, o arquivo SWF do mecanismo de atribuição deve ser publicado no ECM como um documento. Para selecionar o documento no momento da publicação basta clicar sobre o ícone ao lado do campo “Tela de Configuração”.

 

Parâmetros Workflow para Customização de Fichários

Para processos que possuem um fichário padrão definido são passados alguns parâmetros com informações sobre o processo para serem utilizados nas customizações do fichário, conforme abaixo:

WKDefCódigo do processo.
WKVersDefVersão do processo.
Número do processo.Número do processo.
WKNumStateNúmero da atividade.
WKCompanyNúmero da Empresa.
WKUserUsuário Corrente.

Estas informações são passadas como parâmetros da URL do programa que permite o encaminhamento das atividades, portanto no programa de customização do fichário basta recuperar as informações com o comando getValue, conforme exemplo:

var vCodProcess = getValue("WKDef");

 

Customização de E-mail

É possível incluir customizações de e-mail durante o andamento de um Workflow. Existem duas modalidades de customização nessa categoria:

 Envio e alteração de e-mail padrão através do evento onNotify.
 Envio de e-mail customizado em qualquer evento do Workflow.

 

Envio de E-mail Padrão

Para interferir no envio de um e-mail padrão, deve ser utilizado o evento onNotify, que é disparado no exato momento em que qualquer um dos e-mails de processo é enviado. Nesse evento, podem ser feitas alterações, como por exemplo: adicionar outros destinatários ao e-mail (além daqueles que estão participando do processo), modificar os valores dos parâmetros utilizados no template de e-mail, etc.
Abaixo se encontra um exemplo de como implementar esse evento.

Bloco de código
function onNotify(subject, receivers, template, params) {
if (template.match("tpl028")!=null) {
receivers.add("[email protected]");
}
}

O evento onNotify está disponível na lista de eventos do Workflow. Portanto, 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:

1. 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, inclusive aqueles que participam do processo. Exemplo de utilização:           subject.add("ASSUNTO");
2. Receivers: Lista de e-mails destinatários. Também é possível adicionar outros e-mails, de usuários que não participam do workflow. Inclusive, podem ser adicionados e-mails de usuários que não estão cadastrados no       ECM, caso seja necessário notificar uma pessoa que não tenho acesso ao sistema.
3. Template: Permite validar qual tipo de e-mail está sendo enviado (por exemplo, template de nova tarefa, notificação de gestor, 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.
4. 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 TPL028 (que corresponde a Notificação do Gestor), em caso positivo, um novo e-mail será adicionado na lista de destinatários. Ou seja, além do gestor do processo, outra pessoa será notificada, recebendo uma cópia do e-mail que o gestor irá receber. 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.

 

Envio de E-mail Customizado

Caso seja necessário incluir um novo tipo de e-mail, além daqueles que são disponibilizados pelo produto, o ECM permite que o usuário cadastre templates customizados, através do ícone “Templates” na categoria GED ou Painel de Controle, na tela principal do sistema.

Para incluir um novo Template, basta clicar no botão adicionar e preencher os dados solicitados. Nesta etapa também deve ser feito upload do arquivo de template.

Para adicionar parâmetros dentro de um arquivo de template (TXT ou HTML), deve-se utilizar a seguinte notação:

${NOME_USUARIO}

Neste caso, será utilizado o identificador “NOME_USUARIO” durante a customização para atribuir um valor a este parâmetro.

Os templates disponíveis no volume da empresa (<VOLUME>\templates\tplmail) podem ser consultados para mais exemplos de utilização de parâmetros.

Após cadastrar um novo template, é possível utilizá-lo para enviar e-mail a partir de qualquer um dos eventos do Workflow (exceto no onNotify – ver “Envio de E-mail Padrão”).

Para efetuar um envio de e-mail, em base de um template customizado, é utilizado o objeto “notifier”, chamando a função “notify”, conforme o código abaixo:

Bloco de código
try{ 
//Monta mapa com parâmetros do template 
var parametros = new java.util.HashMap(); 
parametros.put("NOME_USUARIO", "JOAO"); 
parametros.put("CODIGO_USUARIO", "01");


//Este parâmetro é obrigatório e representa o assunto do e-mail 
parametros.put("subject", "ASSUNTO"); 
 
//Monta lista de destinatários 
var destinatarios = new java.util.ArrayList(); 
destinatarios.add("MATRICULA-DESTINATARIO"); 
 
//Envia e-mail 
notifier.notify("MATRICULA-REMETENTE", "CODIGO-TEMPLATE", 
parametros, destinatarios, "text/html"); 
 
} catch(e){ 
log.info(e); 
}

O primeiro parâmetro que a função notify recebe é o código/matrícula do usuário que irá enviar o e-mail (remetente).

O segundo parâmetro é o código do template que foi cadastrado através do ícone de Templates.

O terceiro parâmetro é um mapa de dados (java.util.HashMap) que contém os parâmetros que serão utilizados para preencher as variáveis do template.

Por padrão, os parâmetros WDK_VirtualDir (diretório virtual) e WDK_AdviceUser (Nome do colaborador remetente) são adicionados ao mapa de parâmetros automaticamente e podem ser utilizados na template, sem que os valores sejam adicionados pela customização.

O quarto parâmetro representa a lista de usuários que irão receber o e-mail (java.util.ArrayList). Esta lista de usuários consiste em uma lista de códigos/matrículas de colaboradores cadastrados no ECM.

O quinto e último parâmetro especifica qual será o formato do e-mail enviado. Os valores aceitos são “text/html” e “text/plain”.

Outra forma de executar o método de envio de email é informando o número da ficha, conforme exemplo:

notifier.notify("MATRICULA-REMETENTE", NÚMERO DA FICHA, "CODIGO-TEMPLATE", parametros, destinatarios, "text/html");

ATENÇÃO: Obrigatoriamente o valor informado deve ser uma ficha. Outros tipos de documentos não serão tratados e ocorrerá erro na execução do evento.

Ao executar este método, automaticamente os parâmetros abaixo serão adicionados a lista de parâmetros e podem ser utilizados na template:

WDK_CardContentConteúdo HTML da ficha (simula a visualização)
WDK_DocumentAuthorNome do Autor
WDK_DocumentCommentsComentário adicional
WDK_DocumentDescriptionDescrição da ficha
WDK_DocumentIconImageImagem do ícone da ficha
WDK_DocumentNumberNúmero da ficha
WDK_DocumentUpdatedDateData de atualização da ficha
WDK_DocumentVersionVersão da ficha
WDK_DocumentViewLinkLink para acesso a ficha


Third Party Trademarks


Adobe, Flash, Flex, Flex Builder, PostScript and Reader are either registered trademarks or trademarks of Adobe Systems Incorporated in the United States and/or other countries.

Apache is a trademark of The Apache Software Foundation.

Apple is a trademark of Apple Inc., registered in the U.S. and other countries

Firefox and Mozilla are registered trademarks of the Mozilla Foundation.

Google, Android and Google Chrome are trademarks of the Google Inc.

IOS is a trademark or registered trademark of Cisco in the U.S. and other countries and is used under license

JavaScript is a trademark of Oracle Corporation.

Liferay, Liferay Portal, and the Liferay logo are trademarks or registered trademarks of Liferay, Inc., in the United States and other countries.

Linux® is the registered trademark of Linus Torvalds in the U.S. and other countries.

Microsoft, Active Directory, Excel, Internet Explorer, Outlook, PowerPoint, SQL Server, Windows and Windows Vista are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries.

MySQL is a trademark of Oracle Corporation and/or its affiliates.

openDBcopy is an open-source project by Anthony Smith, published under the terms of the GNU General Public License

OpenLDAP is a registered trademark of the OpenLDAP Foundation

Oracle, Java and OpenOffice.org are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.

Progress and OpenEdge are trademarks or registered trademarks of Progress Software Corporation or one of its subsidiaries or affiliates in the U.S. and other countries.

Red Hat and JBoss are registered trademarks of Red Hat, Inc. in the United States and other countries.

This product includes software developed by the Visigoth Software Society (http://www.visigoths.org/).

Any other third party trademarks are the property of their respective owners.