Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Índice

 

Índice
outlinetrue
stylenone
exclude.*ndice

...

Desenvolvimento de Workflow

Propriedades Extensão

As propriedades de extensão 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).

...

Na imagem a seguir é possível visualizar o atributo adicionado, definindo as atividades 2 e 4 (separadas por vírgula) como atividades automáticas do processo.

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.

...

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:

 


hAPI

Em todos os 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:

...

EventoDescriçãoParâmetros
afterCancelProcess

Ocorre após o cancelamento da solicitação.

  • Usuário corrente (String);
  • Número do processo (Integer).
afterProcessCreate

Ocorre logo após a criação de um novo processo.

Nota

Observação: Em caso de execução deste evento um em sub-processo, não será possível definir ou resgatar dados da ficha anexada ao sub-processo, pois nessa situação a ficha ainda não está criada.

  • Número do novo processo (Integer).
afterProcessFinish

Ocorre após finalizada a solicitação.

  • Número do processo (Integer).
afterReleaseVersion

Ocorre após a liberação de uma versão do processo.

  • XML com a definição do processo (String).
afterStateEntryOcorre após a entrada em uma nova atividade.
  • Sequência da atividade (Integer).
afterStateLeaveOcorre após a saída de uma atividade.
  • Sequência da atividade (Integer).
afterTaskComplete

Ocorre após o usuário completar uma tarefa, porém as informações de próxima tarefa e usuários destino já foram salvas.

  • Usuário corrente (String);
  • Sequência da próxima atividade (Integer);
  • Lista de usuários destino (List<String>).
afterTaskCreateOcorre após o usuário receber uma tarefa.
  • Matrícula do usuário (String).
afterTaskSave

Ocorre após 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>).
beforeCancelProcess

Ocorre antes do cancelamento da solicitação.

  • Usuário corrente (String);
  • Número do processo (Integer).
beforeStateEntryOcorre antes da entrada em uma nova atividade.
  • Sequência da atividade (Integer).
beforeStateLeaveOcorre antes da saída de uma atividade.
  • Sequência da atividade (Integer).
beforeTaskComplete

Ocorre antes que o usuário complete uma tarefa, porém as informações de próxima tarefa e usuários destino já foram salvas.

  • Usuário corrente (String);
  • Seqüência da próxima atividade (Integer);
  • Lista de usuários destino (List<String>).
beforeTaskCreateOcorre antes que o usuário receba uma tarefa.
  • Matrícula do usuário (String).
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 alterar os dados do consenso de uma atividade.

Exemplo:

Bloco de código
themeEclipse
languagejavascript
firstline1
linenumberstrue
function calculateAgreement(currentState, agreementData) {
	log.info("Consenso Atual: " + agreementData.get("currentPercentage"));
	log.info("Atividade Destino Atual: " +  agreementData.get("currentDestState"));
	log.info("Usuario Destino Atual: " + agreementData.get("currentDestUsers"));
	
	//Altera o consenso
	agreementData.put("currentPercentage", 100);
	agreementData.put("currentDestState", 2);
	agreementData.put("currentDestUsers", "adm,teste,super");
}
  • currentState (Integer): atividade que terá o consenso alterado;
  • agreementData (Map<String, Object>): mapa de dados com o percentual calculado, a atividade destino e os usuários de destino. Para obter os valores, utilize o método "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.

Nota

Observação: A propriedade WKCompletTask não deve ser utilizada neste evento, pois quando ele é executado o produto ainda não tem a informação se atividade foi ou não completada.

  • Número do processo (Integer).
subProcessCreatedOcorre quando um sub-processo é criado.
  • 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.

  • Sequência da atividade atual (Integer);
  • Lista das sequências das atividades (List<Integer>).  

...

Nota

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.

Para isso pode ser utilizado a seguinte lógica:

Bloco de código
themeEclipse
languagejavascript
firstline1
linenumberstrue
function beforeStateEntry(sequenceId) {
	if (sequenceId  != "NUMERO_DA_ATIVIDADE_INICIAL") {
		var campo = hAPI.getCardValue("campo1");
	}
}

Customização do Processo

Com o uso de eventos, o Fluig permite que um processo seja customizado possibilitando a execução de ações definidas pelo usuário, tais como:

...

Deck of Cards
effectDuration0.5
idsamples
historyfalse
effectTypefade
Card
defaulttrue
id1
labelExemplo 1

Para validar se o usuário está completando uma atividade corretamente, basta utilizar o evento beforeTaskSave e retornar alguma mensagem caso queira disparar um erro. Por exemplo, segue parte de um código de customização para um processo:

Bloco de código
themeEclipse
languagejavascript
firstline1
linenumberstrue
function beforeTaskSave(colleagueId, nextSequenceId, userList) {
	var ativAtual = getValue("WKNumState");
	var process = parseInt(globalVars.get("process"));
	
	var resp1 = hAPI.getCardValue("resp1_H");
	var eficacia1 = hAPI.getCardValue("eficaz1");  
	var controle1 = hAPI.getCardValue("controle1");
	var eficaz = true;

	var users = new java.util.ArrayList();

	if (ativAtual == 7 && nextSequenceId == 12) {
		if (resp1 != "" && eficacia1 != "1" && eficacia1 != "2") {
			if (verificaUsuario(users, resp1)) {
				users.add(resp1);
			}
		}

		hAPI.setAutomaticDecision(8, users, "Decisao tomada automaticamente pelo Fluig.");
	
	} else if (ativAtual == 9 && nextSequenceId == 13) {
		if (resp1 != "" && eficacia1 == "2" && controle1 == ""){
			eficaz = false;
		}

		if (eficaz) {
			var codGrupo = buscaGrupo(process, "Qualidade");
			users.add("Pool:Group:" + codGrupo);
			hAPI.setAutomaticDecision(6, users , "Decisao tomada automaticamente pelo Fluig.");
		}
	}
}
Card
id2
labelExemplo 2

Para fazer com que uma decisão seja tomada automaticamente, os seguintes procedimentos devem ser executados:

  1. Adicionar na Extensão do Processo a propriedade AutomaticTasks com a lista de todas as atividades que terão decisão delegada via customização. Exemplo: AutomaticTasks=3,6,10.
  2. Implementar o evento beforeStateEntry e executar o método "setAutomaticDecision" da hAPI, passando como parâmetros a próxima atividade, o próximo usuário (ou lista de usuários) e uma observação.

 

Bloco de código
themeEclipse
languagejavascript
firstline1
linenumberstrue
function beforeStateEntry(sequenceId) {    
	var userList = new java.util.ArrayList();
	userList.add("adm");
	hAPI.setAutomaticDecision(6, userList, "Decisao tomada automaticamente pelo Fluig.");
}
Informações

As atividades com decisão automática também podem ser criadas via editor de processo.

Card
id3
labelExemplo 3

Para iniciar uma nova solicitação de um outro processo ao finalizar uma solicitação pode ser executados os seguintes procedimentos:

  1. Cadastrar um serviço no Fluig em que a URL seja o WSDL do serviço ECMWorkflowEngineService.
  2. Implementar o evento afterProcessFinish utilizando o exemplo abaixo. Sendo ‘process2’ o novo processo a ser inicializado

Tratamento de Exceções

As 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 tratamento de exceção no evento beforeTaskSave pode ser utilizado somente se a solicitação já estiver inicializada.

...

Bloco de código
themeEclipse
languagejavascript
firstline1
linenumberstrue
function beforeTaskSave(colleagueId, nextSequenceId, userList) {
	if (getValue("WKUserComment") == null || getValue("WKUserComment") == "") {
		throw "A observação deve ser preenchida";
	}	
}

function beforeCancelProcess(colleagueId, processId) {
	if (getValue("WKUserComment") == null || getValue("WKUserComment") == "") {
		throw "A observação deve ser preenchida";
	}	
}

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 usuários para uma atividade. Esta lista pode ser utilizada em dois momentos:

...

Mecanismo de AtribuiçãoDescrição
Para um Papel (Pool)Permite atribuir tarefas a um papel e não apenas a um usuário. Assim, qualquer um dos usuários neste papel pode assumir as tarefas para completá-las.
Para um Grupo (Pool)Permite atribuir tarefas a um grupo e não apenas a um usuário. Assim, qualquer um dos usuários deste grupo pode assumir as tarefas para completá-las.
Por AssociaçãoPermite compor lógicas complexas de atribuição por intermédio da associação de vários mecanismos.
Por Campo de Formulário

Permite atribuir tarefas ao usuário informado em um campo do formulário do processo.

Por Executor de AtividadePermite selecionar os usuários que executaram uma atividade anterior.
Por GrupoPermite filtrar apenas os usuários que façam parte de um determinado grupo.
Por Grupos do Usuário

Permite filtrar apenas os usuários que pertençam a um dos grupos do usuário corrente, ou do usuário que iniciou o processo (solicitante). Também permite filtrar apenas os usuários cujo grupo de trabalho seja o mesmo do usuário (corrente ou solicitante).

Por PapelPermite filtrar apenas os usuários que possuam um determinado papel.
Por UsuárioPermite atribuir tarefas a um usuário específico.

Como criar um Mecanismo de Atribuição

A criação de um mecanismo de atribuição é realizada pelo Fluig Studio, sendo necessário já existir um projeto Fluig.

...

Deck of Cards
startHiddenfalse
effectDuration0.5
idmecatrib
historyfalse
effectTypefade
Card
defaulttrue
id1
label1º Passo

 

Para criar um novo mecanismo de atribuição customizado, clicar com o botão direito do mouse no projeto do Fluig, acessar a opção New e então a opção Other. No assistente aberto, selecionar a opção "Mecanismo customizado Fluig" presente na pasta Fluig e clicar no botão Next:

 

Card
id2
label2º Passo

 

O assistente Novo Mecanismo Fluig é aberto. Informar o Código e uma descrição e clicar no botão Finish:

 

Card
id3
label3º Passo (Implementação)

 

O arquivo JavaScript do mecanismo de atribuição é adicionado ao projeto na pasta mechanisms e aberto para edição.

O script de customização de mecanismo de atribuição recebe como parâmetro o código do processo e o usuário corrente. Este script deve retornar uma lista dos usuários que podem assumir a tarefa. Abaixo, exemplo de implementação:

Bloco de código
themeEclipse
languagejavascript
firstline1
linenumberstrue
function resolve(process, colleague) {
	var userList = new java.util.ArrayList();

	var groupId = colleague.getGroupId();

	var c1 = DatasetFactory.createConstraint("cdArea", groupId, groupId, ConstraintType.MUST); 
	var constraints = new Array(c1);
	
	var dataset = DatasetFactory.getDataset("dsResponsaveisArea", null, constraints, null);
	
	for (var i = 0; i < dataset.rowsCount; i++) {
		userList.add(dataset.getValue(i, "cdUsuarioResp"));
	}
	
	return userList;
}
Informações

É possível acessar Datasets e Serviços cadastrados no Fluig na customização do mecanismo de atribuição.

Card
id4
labelÚltimo Passo (Exportação)


Por fim, o mecanismo de atribuição customizado deve ser exportado para o servidor do Fluig e ao realizar a exportação deve ser informado obrigatoriamente seu código e nome, e opcionalmente uma descrição:

 

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

Para processos que possuem uma definição de formulário definida são passados alguns parâmetros com informações sobre o processo para serem utilizados nos eventos da definição de formulário, conforme abaixo:

...

Âncora
mailcustom
mailcustom

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.

...

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 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.

...