Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Customização de Workflow
Índice
1 Customização de Workflow
1.1 Propriedades Avançadas
1.2 Eventos do Processo
1.3 Customização do Processo
1.4 Tratamento de Exceções
1.5 Mecanismo de Atribuição
1.6 Como criar um Mecanismo de Atribuição
1.7 Parâmetros Workflow para Customização de Formulários
1.8 Customização de E-mail
1.8.1 Envio de E-mail Padrão
1.8.2 Envio de E-mail Customizado
2 Third Party Trademarks
Customização de Workflow
O cadastro de propriedades avançadas do processo é realizado pelo Fluig Studio, sendo necessário que o diagrama do processo já esteja
criado. Para cadastrar uma propriedade avançada, é necessário abrir o processo para edição, e na visão Properties acessar a opção
vançado:
Deve se utilizar os botões Adicionar, Editar e Excluir para a manutenção das propriedades avançadas do processo. 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:
http://tdn.totvs.com/pages/viewpage.action?pageId=73082818#CustomizaçãodeWorkflow-CustomizaçãodeWorkflow 1/14
15/6/2014 CustomizaçãodeWorkflow-Fluig-TDN
Eventos do Processo
Os eventos 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 momentos pré-determinados, como por exemplo a criação da
solicitação do processo ou a entrada em uma nova atividade.
implementação dos eventos do processo é realizada pelo Fluig Studio, sendo necessário já existir um projeto Fluig com pelo menos um
diagrama de processo.
Para criar um novo evento do processo, clicar com o botão direito do mouse no projeto, acessar a opção New e em seguida a opção
Other. No assistente aberto, selecionar a opção "Script Evento Workflow", presente na pasta Fluig, e clicar no botão Next. Na nova tela
selecionar qual o evento que será criado e relacionar ele a um processo já existente. Para finalizar, clicar no botão Finish:
Em todos os eventos do processo é possível obter informações da API de Workflow. Cada evento possui acesso ao handle da API de
hAPI. Os seguintes métodos estão disponíveis através dahAPI:
orkflow através da variável global
1 function afterTaskCreate(colleagueId) {
2
3 var nrProxAtividade = getValue("WKNextState");
4 if (nrProxAtividade == "5"){ //atividade entre paralelas
5
6 var data = new Date();
7 var numEmpresa = getValue("WKCompany");
8
9 //seta o dia, mês (Janeiro é 0) e ano
10 data.setDate(20);
11 data.setMonth(10);
12 data.setFullYear(2010);
13
14 // Recupera o numero da solicitação
15 var numProcesso = getValue("WKNumProces");
16
17 // Seta o prazo para as 14:00
18 hAPI.setDueDate(numProcesso,
19 hAPI.getActualThread(numEmpresa, numProcesso, nrProxAtividade),
20 colleagueId, data, 50400);
}
}
setDueDate(numProcesso, Permite alterar o prazo de conclusão para uma determinada atividade do processo, onde:
numThread, "userId",
dataConclusao, tempoSeg) numProcesso: número da solicitação;
numThread: número da thread (normalmente 0, quando não se utiliza atividades paralelas);
userId: o usuário responsável pela tarefa;
dataConclusao: a nova data de conclusão;
tempoSeg: tempo que representa a nova hora de conclusão, calculado em segundos após a
meia-noite.
1 function afterTaskCreate(colleagueId) {
2 var data = new Date();
3
4 //seta o dia, mês (Janeiro é 0) e ano
5
6 data.setDate(20);
data.setMonth(10);
7 data.setFullYear(2010);
8
9 // Recupera o numero da solicitação
10 var processo = getValue("WKNumProces");
11
12 // Seta o prazo para as 14:00
13 hAPI.setDueDate(processo, 0, colleagueId, data, 50400);
14 }
Retorna um mapa com informações da solicitação criada. Entre elas, o iProcess que é o número
da solicitação criada.
setColleagueReplacement(userId) Seta um usuário substituto, onde:
userId: código do usuário substituto.
setTaskComments("userId", Define uma observação para uma determinada tarefa do processo, onde:
numProcesso, numThread, "obs")
userId: usuário responsável pela tarefa;
numProcesso: número da solicitação de processo;
numThread: é o número da thread (normalmente 0, quando não se utiliza atividades paralelas);
obs: a observação.
getCardData(numProcesso) Retorna um Mapa com todos os campos e valores do formulário da solicitação.
numProcesso: número da solicitação de processo.
getAdvancedProperty("propriedade") Retorna o valor da propriedade avançada de um processo.
propriedade: nome da propriedade avançada.
calculateDeadLineHours(data, Calcula um prazo a partir de uma data com base no expediente e feriados cadastrados no
segundos, prazo, periodId) produto passando o prazo em horas:
data: Data inicial (tipo Date);
segundos: Quantidade de segundos após a meia noite;
prazo: Prazo que será aplicado em horas (tipo int);
periodId: Código de Expediente.
Retorno: Array de Objeto, onde a primeira posição do array é a data e a segunda a hora.
Exemplo:
1 function afterTaskCreate(colleagueId) {
2 var data = new Date();
3
4 //Calcula o prazo
5 var obj = hAPI.calculateDeadLineHours(data, 50000, 2,
6 "Default");
7 var dt = obj[0];
8
9 var segundos = obj[1];
10 //Recupera o numero da solicitação
11 var processo = getValue("WKNumProces");
12
13 //Altera o prazo do processo
14 hAPI.setDueDate(processo,0,colleagueId, dt, segundos);
}
http://tdn.totvs.com/pages/viewpage.action?pageId=73082818#CustomizaçãodeWorkflow-CustomizaçãodeWorkflow 4/14
15/6/2014 CustomizaçãodeWorkflow-Fluig-TDN
calculateDeadLineTime(data, Calcula um prazo a partir de uma data com base no expediente e feriados cadastrados no
segundos, prazo, periodId) produto passando o prazo em minutos:
data: Data inicial (tipo Date);
segundos: Quantidade de segundos após a meia noite;
prazo: Prazo que será aplicado em minutos (tipo int).
periodId - Código de Expediente
Retorno: Array de Objeto, onde a primeira posição do array é a data e a segunda a hora.
Exemplo:
1 function afterTaskCreate(colleagueId) {
2 var data = new Date();
3 //Calcula o prazo
4 var obj = hAPI.calculateDeadLineTime(data, 50000, 120,
5 "Default");
6 var dt = obj[0];
7 var segundos = obj[1];
8
9 //Recupera o numero da solicitação
10 var processo = getValue("WKNumProces");
11
12 // Altera o prazo do processo
13 hAPI.setDueDate(processo,0,colleagueId, dt, segundos);
}
getUserTaskLink(numAtiv) Permite
um buscar
e-mail o link paracustomizado,
com template movimentaçãopordeexemplo.
uma determinada atividade, e utilizá-lo para enviar
Atenção
Este método não retorna link para atividades que ainda não foram criadas, ou seja, não
pode ser utilizado em eventos como
afterTaskComplete(colleagueId,nextSequenceId,userList) para obter o link da atividade
com "nextSequenceId".
Exemplo:
http://tdn.totvs.com/pages/viewpage.action?pageId=73082818#CustomizaçãodeWorkflow-CustomizaçãodeWorkflow 5/14
15/6/2014 CustomizaçãodeWorkflow-Fluig-TDN
1 function afterTaskCreate(colleagueId) {
2 var sequenceId = getValue("WKCurrentState");
3 if (sequenceId == 2) {
4 var destinatarios = new java.util.ArrayList();
5 destinatarios.add(colleagueId);
6
7 var parametros = new java.util.HashMap();
8 parametros.put("WDK_CompanyId", getValue("WKCompany"));
9 parametros.put("WDK_TaskLink",
10 hAPI.getUserTaskLink(sequenceId));
11
12 notifier.notify(getValue("WKUser"), "tplCustomizado",
13 parametros, destinatarios, "text/html");
}
}
Nos eventos existe a possibilidade de integração com serviços de dados. Tais serviços podem ser WebServices, AppServer Progress® e
Dataset.
O acesso a WebServices ou AppServer Progress® deve ser previamente configurado no cadastro de Serviços. Para mais detalhes
consulte em Integração Com Aplicativos Externos, no capítulo "Acessando WebServices a partir do Fluig".
baixo um exemplo de como executar o WebService de Colleague para criar um usuário no Fluig após executar uma tarefa:
http://tdn.totvs.com/pages/viewpage.action?pageId=73082818#CustomizaçãodeWorkflow-CustomizaçãodeWorkflow 6/14
15/6/2014 CustomizaçãodeWorkflow-Fluig-TDN
processo
Observação: Em caso de execução deste evento um em sub-processo, não
(Integer).
será possível definir ou resgatar dados da ficha anexada ao sub-processo, pois
nessa situação a ficha ainda não está criada.
http://tdn.totvs.com/pages/viewpage.action?pageId=73082818#CustomizaçãodeWorkflow-CustomizaçãodeWorkflow 7/14
15/6/2014 CustomizaçãodeWorkflow-Fluig-TDN
beforeTaskSave Ocorre antes de salvar as informações selecionadas pelo usuário. Usuário corrente
(String);
Sequência da
próxima
atividade
(Integer);
Lista de
usuários destino
(List<String>).
calculateAgreement Ocorre após o cálculo do consenso (somente para atividades conjuntas) e permite currentState
alterar os dados do consenso de uma atividade. (Integer):
atividade que
Exemplo: terá o consenso
alterado;
agreementData
1 function calculateAgreement(currentState, agreementData) { (Map<String,
2 log.info("Consenso Atual: " + Object>): mapa
3 agreementData.get("currentPercentage"));
4 log.info("Atividade Destino Atual: " +
de dados com o
5 agreementData.get("currentDestState")); percentual
6 log.info("Usuario Destino Atual: " + calculado, a
7 agreementData.get("currentDestUsers")); atividade destino
8 e os usuários de
9 //Altera o consenso destino. Para
10 agreementData.put("currentPercentage", 100); obter os valores,
agreementData.put("currentDestState", 2);
utilize o método
agreementData.put("currentDestUsers",
"adm,teste,super"); "get" e para
} atribuir um valor,
utilize o método
"put".
onNotify Ocorre após a movimentação da solicitação e antes de enviar as notificações. Para mais
detalhes consulte
o capítulo
Customização de
E-mail.
setProcess Ocorre quando um processo é "setado" na API. Número do
processo
Observação: A propriedade WKCompletTask não deve ser utilizada neste (Integer).
evento, pois quando ele é executado o produto ainda não tem a informação se
atividade foi ou não completada.
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 formulário na inicialização
do processo, sendo possível somente a partir da segunda tarefa.
http://tdn.totvs.com/pages/viewpage.action?pageId=73082818#CustomizaçãodeWorkflow-CustomizaçãodeWorkflow 8/14
15/6/2014 CustomizaçãodeWorkflow-Fluig-TDN
1 function beforeStateEntry(sequenceId) {
2 if (sequenceId != "NUMERO_DA_ATIVIDADE_INICIAL") {
3 var campo = hAPI.getCardValue("campo1");
4 }
5 }
Existem algumas propriedades que contém informações referentes à solicitação que podem ser utilizadas na customização do processo,
são elas:
lém dessas propriedades já alimentadas pelo produto, é possível criar propriedades customizadas que podem ser utilizadas nos
eventos. O produto disponibiliza a variávelglobalVars , que é um mapa de dados (Map<String, String>) e estará disponível em todos os
eventos.
Para adicionar uma propriedade e seu valor, utilize o método globalVars.put("name", "value"), onde "name" é o nome da propriedade e
"value" o seu valor. Exemplo: globalVars.put("WDAprovador","adm");
Para recuperar os valores da variável globalVars, utilize o método globalVars.get("name"), onde "name" é o nome da propriedade a ser
retornado o valor. Exemplo: globalVars.get("WDAprovador");
Tr atament o de Exceções
s exceções podem ser tratadas nos seguintes eventos: beforeStateEntry, beforeTaskSave e beforeCancelProcess. O tratamento de
exceção no evento beforeStateEntry pode ser utilizado na inicialização de solicitações, pois ele impede que a solicitação seja iniciada. O
ratamento de exceção no evento beforeTaskSave pode ser utilizado somente se a solicitação já estiver inicializada.
http://tdn.totvs.com/pages/viewpage.action?pageId=73082818#CustomizaçãodeWorkflow-CustomizaçãodeWorkflow 9/14
15/6/2014 CustomizaçãodeWorkflow-Fluig-TDN
1 function beforeStateEntry(sequenceId) {
2 var activity = getValue("WKNumState");
3 if (activity == 0 || activity == 1) {
4 //Outra condição.
5 throw "TRATAMENTO DE EXCEÇÃO";
6 }
7 }
8
9 function beforeTaskSave(colleagueId, nextSequenceId, userList) {
10 var activity = getValue("WKNumState");
11 if (activity != 0 && activity != 1) {
12 //Outra condição
13 throw "TRATAMENTO DE EXCEÇÃO";
14 }
15 }
16
17 function beforeCancelProcess(colleagueId, processId) {
18 //Condição.
19 throw "TRATAMENTO DE EXCEÇÃO";
20 }
É possível consultar o campo observação de uma solicitação de processo, verificando se ele foi preenchido ou não. Para isto, é
necessário validar a propriedadeWKUserComment no eventobeforeTaskSave ou no eventobeforeCancelProcess . Exemplo:
No primeiro caso, a lista é gerada de acordo com o mecanismo de atribuição existente na primeira atividade do processo (que representa
a atividade inicial). 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.
Mecanismo Descrição
de
Atribuição
Para um Permite atribuir tarefas a um papel e não apenas a um usuário. Assim, qualquer um dos usuários neste papel pode
Papel (Pool) assumir as tarefas para completá-las.
Para um Permite atribuir tarefas a um grupo e não apenas a um usuário. Assim, qualquer um dos usuários deste grupo pode
Grupo assumir as tarefas para completá-las.
(Pool)
Por Permite compor lógicas complexas de atribuição por intermédio da associação de vários mecanismos.
Associação
Por Campo Permite atribuir tarefas ao usuário informado em um campo do formulário do processo.
de
Formulário
http://tdn.totvs.com/pages/viewpage.action?pageId=73082818#CustomizaçãodeWorkflow-CustomizaçãodeWorkflow 10/14
15/6/2014 CustomizaçãodeWorkflow-Fluig-TDN
Por Permite selecionar os usuários que executaram uma atividade anterior.
Executor de
Atividade
Por Grupo Permite filtrar apenas os usuários que façam parte de um determinado grupo.
Por Grupos Permite filtrar apenas os usuários que pertençam a um dos grupos do usuário corrente, ou do usuário que iniciou o
do Usuário processo (solicitante). Também permite filtrar apenas os usuários cujo grupo de trabalho seja o mesmo do usuário
(corrente ou solicitante).
Por Papel Permite filtrar apenas os usuários que possuam um determinado papel.
Por Usuário Permite atribuir tarefas a um usuário específico.
Nos scripts dos eventos da definição de formulário basta recuperar as informações com o comando getValue, conforme exemplo:
ar 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 eventoonNotify;
Envio de e-mail customizado em qualquer evento do workflow.
http://tdn.totvs.com/pages/viewpage.action?pageId=73082818#CustomizaçãodeWorkflow-CustomizaçãodeWorkflow 11/14
15/6/2014 CustomizaçãodeWorkflow-Fluig-TDN
(além daqueles que estão participando do processo), modificar os valores dos parâmetros utilizados no template de e-mail, etc.
O evento onNotify está disponível na lista de eventos do processo. 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:
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");
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 tenho acesso ao sistema.
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.
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.
Caso seja necessário incluir um novo tipo de e-mail, além daqueles que são disponibilizados pelo produto, o Fluig permite que o usuário
cadastre templates de e-mails customizados, através da opção Templates de Emails presente na aba Gerais do Painel de Controle.
Para incluir um novo Template, basta acionar a opção Adicionar no menu e preencher os dados solicitados. Nesta etapa também deve ser
eito 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_DO_PARAMETRO}
Neste caso, será utilizado o identificador "NOME_DO_PARAMETRO" durante a customização para atribuir um valor a este parâmetro. Os
emplates 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 processo (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:
http://tdn.totvs.com/pages/viewpage.action?pageId=73082818#CustomizaçãodeWorkflow-CustomizaçãodeWorkflow 12/14
15/6/2014 CustomizaçãodeWorkflow-Fluig-TDN
1 try{
2 //Monta mapa com parâmetros do template
3 var parametros = new java.util.HashMap();
4 parametros.put("NOME_USUARIO", "JOAO");
5 parametros.put("CODIGO_USUARIO", "01");
6
7 //Este parâmetro é obrigatório e representa o assunto do e-mail
8 parametros.put("subject", "ASSUNTO");
9
10 //Monta lista de destinatários
11 var destinatarios = new java.util.ArrayList();
12 destinatarios.add("CODIGO-DESTINATARIO");
13
14 //Envia e-mail
15 notifier.notify("MATRICULA-REMETENTE", "CODIGO-TEMPLATE", parametros, destinatarios, "text/html");
16
17 } catch(e){
18 log.info(e);
19 }
Onde:
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 no Fluig.
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 no 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 de usuários cadastrados no Fluig.
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:
Atenção: Obrigatoriamente o valor informado deve ser um formulário. Outros tipos de documentos não serão tratados e ocorrerá
erro na execução do evento.
o executar este método, automaticamente os parâmetros abaixo serão adicionados na lista de parâmetros e podem ser utilizados no
emplate:
http://tdn.totvs.com/pages/viewpage.action?pageId=73082818#CustomizaçãodeWorkflow-CustomizaçãodeWorkflow 13/14
15/6/2014 CustomizaçãodeWorkflow-Fluig-TDN
ava is registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.
ny other third party trademarks are the property of their respective owners.
Nenhum
http://tdn.totvs.com/pages/viewpage.action?pageId=73082818#CustomizaçãodeWorkflow-CustomizaçãodeWorkflow 14/14