Beruflich Dokumente
Kultur Dokumente
Customização
Workflow
Copyright © 2009 TOTVS S.A. Todos os direitos reservados.
Nenhuma parte deste documento pode ser copiada, reproduzida, traduzida ou transmitida por
qualquer meio eletrônico ou mecânico, na sua totalidade ou em parte, sem a prévia autorização
escrita da TOTVS S.A., que reserva-se o direito de efetuar alterações sem aviso prévio. A TOTVS
S.A não assume nenhuma responsabilidade pelas conseqüências de quaisquer erros ou
inexatidões que possam aparecer neste documento.
TOTVS S.A.
Av. Santos Dumont, 831, Joinville, SC, Brasil, CEP 89.222-900
2
Índice
3
Customização Workflow
Propriedades Avançadas
As propriedades avançadas contêm informações especiais que podem alterar
o comportamento padrão do processo em algum ponto. Elas devem ser
utilizadas principalmente durante a fase de customização ou conter “flags”
especiais que alterem alguma lógica interna (apenas em casos especiais).
Para cadastrar uma propriedade avançada deve-se acessar a opção
“Configuração de Processos” no menu Workflow. Selecione o processo
desejado de acesse a opção “Editar”. A seguinte tela será apresentada:
4
Use os botões Adicionar, Editar e Excluir para a manutenção dos eventos
desejados. Uma propriedade avançada é representada por nome e valor.
Onde o nome deve ser único. Abaixo o formulário para a criação de uma
propriedade avançada.
Listeners do Processo
Os listeners de um processo são um conjunto de scripts carregados pela API
de workflow. Tais scripts são desenvolvidos com o uso da linguagem
JavaScript e chamados ao longo da execução do processo em um momentos
pré-determinados, como por exemplo a criação de um processo ou a entrada
em uma nova atividade.
No ByYou ECM os listeners são tratados como eventos do processo. Assim,
cada listener é representado por um evento.
Para cria a lista de eventos do processo deve-se acessar a opção
“Configuração de Processos” no menu Workflow. Clique sobre a aba
“Avançado” e posteriormente clique sobre a aba “Eventos”. A seguinte tela
será apresentada.
5
Importante
Em todos eventos do processo é possível obter informações da API de
Workflow. Cada evento possui acesso ao handle da API de workflow através
da variável global “hAPI”. Os seguintes métodos estão disponíveis através da
“hAPI”:
• getCardValue(“nome-campo”): permite acessar o valor de um campo
do ficha do processo;
• setCardValue(“nome-campo”,”valor”): permite definir o valor de um
campo da ficha do processo, onde:
o nome-campo: é o nome do campo da ficha;
o valor: é o valor a ser definido para o campo da ficha;
• setAutomaticDecision(int iTask, List<String> cColab, String cObs):
permite definir o fluxo de saída de uma atividade de forma automática,
onde:
o iTask: é a atividade corrente do processo;
o cColab: é uma lista colaboradores – do tipo String;
o cObs: é a observação;
• getActiveStates(): retorna uma lista de inteiros das atividades do
processo;
• setDueDate(int processInstanceId, int threadSequence, String userId,
Date newDueDate, int timeInSeconds): permite alterar o prazo de
conclusão para um determinada atividade do processo, onde:
o processInstanceId: é o número da solicitação workflow;
o threadSequence: é o número da thread (normalmente 0,
quando não se utiliza atividades paralelas);
o userId: o usuário responsável pela tarefa;
6
o newDueDate: a nova data de conclusão.
o timeInSeconds: é o tempo que representa a nova hora de
conclusão, calculado em segundos após a meia-noite.
Nos eventos existe a possibilidade de integração com serviços de dados. Tais
serviços podem ser Web Services, AppServer e Dataset.
O acesso a Web Services ou AppServer deve ser previamente configurado
em “Navegação”, na pasta “Painel de Controle” no cadastro de “Serviço de
dados”. Abaixo a tela de configuração dos serviços de dados.
7
Para realizar a chamada ao Web Service no listener:
var service = serviceManager.getServiceInstance("nome-serviço");
var user = service.execute("nome-operação",null);
Passando parâmetros para o serviço teríamos:
var serviceParams = new java.util.HashMap();
serviceParams.put("nome-parametro","valor");
var service = serviceManager.getServiceInstance("nome-serviço");
var result = service.execute("nome-operação",serviceParams);
8
Para acessar os serviços de dados no evento do listener:
service = serviceManager.getServiceInstance("nome-serviço");
service.getBean();
service.meuMetodo();
Evento Descrição
ProcessSet Ocorre quando um processo é “setado” na API.
Parâmetros: Número do processo (INTEGER).
AfterProcessCreate Ocorre logo após a criação de um novo processo.
Parâmetros: Número do novo processo (INTEGER).
BeforeStateLeave Ocorre antes da saída de uma atividade.
Parâmetros: Seqüência da atividade (INTEGER).
afterStateLeave Ocorre após a saída de uma atividade.
Parâmetros: Seqüência da atividade (INTEGER).
BeforeStateEntry Ocorre antes da entrada em uma nova atividade.
Parâmetros: Seqüência da atividade (INTEGER).
AfterStateEntry Ocorre após a entrada em uma nova atividade.
Parâmetros: Seqüência da atividade (INTEGER).
BeforeTaskCreate Ocorre antes que o usuário receba uma tarefa.
Parâmetros: Matrícula do usuário (CHARACTER).
AfterTaskCreate Ocorre após o usuário receber uma tarefa.
Parâmetros: Matrícula do usuário (CHARACTER).
BeforeTaskSave Ocorre antes de salvar as informações selecionadas
pelo usuário.
9
Parâmetros: Usuário corrente (CHARACTER),
Seqüência da próxima atividade (INTEGER) e lista
de usuários destino (CHARACTER).
AfterTaskSave Ocorre após salvar as informações selecionadas
pelo usuário.
Parâmetros: Usuário corrente (CHARACTER),
Seqüência da próxima atividade (INTEGER) e lista
de usuários destino (CHARACTER).
BeforeTaskComplete Ocorre antes que o usuário complete uma tarefa,
porém as informações de próxima tarefa e
colaboradores destino já foram salvas.
Parâmetros: Usuário corrente (CHARACTER),
Seqüência da próxima atividade (INTEGER) e lista
de usuários destino (CHARACTER).
AfterTaskComplete Ocorre após o usuário completar uma tarefa, porém
as informações de próxima tarefa e colaboradores
destino já foram salvas.
Parâmetros: Usuário corrente (CHARACTER),
Seqüência da próxima atividade (INTEGER) e lista
de usuários destino (CHARACTER).
subProcessCreated Ocorre quando um sub-processo é criado.
Parâmetros: Número do sub-processo (INTEGER).
validateAvailableStates Ocorre após montada a lista de tarefas disponíveis
para o usuário a partir da tarefa atual.
Parâmetros: Seqüência da atividade atual
(INTEGER) e input-output lista das seqüências das
atividades (CHARACTER).
afterProcessFinish Ocorre após finalizada a solicitação.
Parâmetros: Número do processo (INTEGER).
beforeCancelProcess Ocorre antes do cancelamento da solicitação.
Parâmetros: Usuário corrente (CHARACTER) e
Número do processo (INTEGER).
AfterCancelProcess Ocorre após o cancelamento da solicitação.
Parâmetros: Usuário corrente (CHARACTER) e
Número do processo (INTEGER).
AfterRelaseVersion Ocorre após a liberação de uma versão do processo
workflow.
Parâmetros: XML com a definição do processo
(CHARACTER) .
Recomendações:
• Não é necessário criar todos os eventos do processo – apenas
aqueles que se estiver interessado.
• Todos os eventos são executados de forma persistente.
• Importante: Não é possível capturar (hAPI.getCardValue) ou
adicionar (hAPI.setCardValue) dados no fichário na
inicialização do processo. Somente a partir da segunda
tarefa, para isso pode ser utilizado a seguinte lógica:
function beforeStateEntry(sequenceId){
if(sequenceId != “NUMERO_DA_ATIVIDADE_INICIAL” ){
var campo = hAPI.getCardValue(“campo1”);
}
}
10
Customização do Processo
Com o uso de listeners, o ByYou ECM permite que um processo seja
customizado possibilitando a execução de ações definidas pelo usuário, tais
como:
• Validar o ato de completar uma atividade
• Tomar decisões automaticamente
Exemplo 1:
Para validar se o usuário está completando uma atividade corretamente,
basta utilizar o evento beforeTaskComplete e retornar alguma mensagem
caso queira disparar um erro. Por exemplo, segue parte de um código de
customização criado pelo ByYou ECM:
function beforeTaskComplete(colleagueId,nextSequenceId,userList){
var ativAtual = getValue("WKNumState");
var users = new java.util.ArrayList();
var usersTmp = new java.util.ArrayList();
var cUsers;
var process = parseInt(globalVars.get("process"));
var User1 = hAPI.getCardValue("resp1_H");
var eficacia1 = hAPI.getCardValue("eficaz1");
var controle1 = hAPI.getCardValue("controle1");
var eficaz = true;
var codgrupo;
log.info("ATIVIDADE---> " + ativAtual + " - " + nextSequenceId);
11
log.info("EFICAZ " + eficaz);
if(eficaz){
log.info("[if1]");
codGrupo = buscaGrupo(process,"Grupo-Qualidade");
log.info("CODIGO GRUPO " + codGrupo);
users.add("Pool:Group:" + codGrupo);
hAPI.setAutomaticDecision(6, users , "Decisao tomada automaticamente pelo ByYou
ECM.");
}
}
}
Exemplo 2:
Para fazer com que uma decisão seja tomada automaticamente, os seguintes
procedimentos devem ser executados:
1. Configurar em Propriedades Avançadas a propriedade
AutomaticTasks – conforme descrito anteriormente – com a lista de
todas as atividades que terão decisão delegada a um listener (Ex.:
AutomaticTasks=3,6,10).
2. Implementar o vento beforeStateEntry e executar e chamar a o
método “setAutomaticDecision” da hAPI, passando como parâmetros
o próximo estado, o próximo usuário (ou lista de usuários) e a
observação.
function beforeStateEntry(sequenceId) {
var userList = new java.util.ArrayList();
userList.add(“Administrator”);
hAPI.setAutomaticDecision(new java.lang.Integer(8), userList, “Observação”);
}
Tratamento de Exceçõ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:
12
function beforeStateEntry(sequenceId){
var activity = getValue("WKNumState");
if (activity == 0 || activity == 1){
//outra condição.
throw "TRATAMENTO DA EXCEÇÃO"
}
}
function beforeTaskSave(colleagueId,nextSequenceId,userList){
var activity = getValue("WKNumState");
if (activity != 0 && activity != 1){
// outra condição
throw "TRATAMENTO DE EXCEÇÃO";
}
}
function beforeCancelProcess(colleagueId, processId){
// condição.
throw "TRATAMENTO DA EXCEÇÃO"
}
Mecanismo de Atribuição
Os mecanismos de atribuição são instrumentos utilizados durante um
processo de workflow que permitem criar, segundo um critério estabelecido
pelo próprio mecanismo, uma lista de possíveis colaboradores para uma
atividade. Esta lista pode ser utilizada em dois momentos:
1. Na inicialização do processo, onde o sistema verifica se o usuário
corrente faz parte desta lista e, portanto, pode iniciá-lo;
2. No momento do encaminhamento de uma tarefa, quando esta lista é
apresentada ao usuário corrente com opções de encaminhamento da
solicitação.
No primeiro caso, a lista é gerada de acordo com o mecanismo de atribuição
existente na primeira atividade do processo (que representa a atividade de
start). Nas demais atividades é adotado o segundo procedimento. Quando
não houver um mecanismo de atribuição associado a uma atividade (seja ela
inicial ou não), todos os usuários são considerados válidos.
Na inicialização do ByYou ECM são criados alguns mecanismos
automaticamente, conforme abaixo:
Mecanismo Descrição
Associado Permite compor lógicas complexas de atribuição por
intermédio da associação de vários mecanismos.
Campo Formulário Permite atribuir tarefas ao colaborador informado
em um campo do formulário do processo.
13
Executor Atividade Permite selecionar os colaboradores que
executaram uma atividade anterior.
Grupo Permite filtrar apenas os colaboradores que façam
parte de um determinado grupo.
Grupos Colaborador Permite 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).
Papel Permite filtrar apenas os colaboradores que
possuam um determinado papel no Workflow.
Pool Grupo Permite 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 Papel Permite 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ário Permite atribuir tarefas a um colaborador específico.
14
A tela apresenta todos os mecanismos de atribuição padrão do ByYou ECM e
também os mecanismos customizados.
Para criar um novo mecanismo de atribuição clique sobre o botão “Adicionar”,
então a seguinte tela será apresentada:
15
<?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"}]);
this.dispatchEvent(event);
this.closeWindow();
}
<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>
16
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:
function resolve(process,colleague,configXML){
if (newXML.area.toString()=="asd1") {
userList.add('adm');
} else if (newXML.area.toString()=="asd2") {
userList.add('1');
} else {
userList.add('10');
}
return userList;
}
17
Arquivo FLEX-CONFIG-MXMLC.XML:
<metadata>
<title>By You 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>
18
Parâmetros Workflow para Customização de
Fichários
Customização de E-mail
19
}
Caso seja necessário incluir um novo tipo de e-mail, além daqueles que são
disponibilizados pelo produto, o ByYou 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.
20
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.
${NOME_USUARIO}
try{
//Monta mapa com parâmetros do template
var parametros = new java.util.HashMap();
parametros.put("NOME_USUARIO", "JOAO");
parametros.put("CODIGO_USUARIO", "01");
//Envia e-mail
notifier.notify("MATRICULA-REMETENTE", "CODIGO-TEMPLATE",
parametros, destinatarios, "text/html");
}catch(e){
log.info(e);
}
21
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.
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 ByYou 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”.
22