Árvore de páginas

Versões comparadas

Chave

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

...

ParâmetroDescrição
WKDefCódigo do processo.
WKVersDefVersão do processo.
WKNumProcesNúmero da solicitação de processo.
WKNumStateNúmero da atividade.
WKCompanyNúmero da empresa.
WKUserCódigo do usuário corrente.
WKUserComment

A partir do fluig 1.5 é possível adicionar Complementos em uma solicitação. Este recurso permite inserir diversas observações na mesma solicitação. Ou seja, não temos mais apenas um comentário por atividade.
Os complementos em solicitações permitem que um usuário adicione comentários ou anexos em uma solicitação aberta sendo ou não responsável pela tarefa corrente com a finalidade de evitar comunicação por outros meios que não ficarão registrados no histórico do processo.

Por isso a forma de retornar a informação mudou para a variável WKUserComment. Agora ela recebe um texto com todas as observações feitas pelos usuários na atividade corrente.
Exemplo do valor atual da variável WKUserComment:
"
Nome do usuário - 09/03/2017 - 10:46 -
Observação feita pelo usuário

Nome do usuário - 09/03/2017 - 10:45 -
Nova observação feita pelo usuário
"

OBS: Esse parâmetro irá retornar apenas os comentários da atividade corrente.


A partir da Atualização 1.5, para resgatar os complementos (observação) de uma tarefa, deve ser utilizado o método da API Pública:
https://api.fluig.com/resource_WorkflowRest.html#path__2.0_workflows_findObservations_-processInstanceId-_-stateSequence-_-threadSequence-.html

Documentação que explica como utilizar a API publica em eventos:
http://tdn.totvs.com/x/hRwSCw

WKCompletTaskSe a tarefa foi completada ("true"/"false").
WKNextStateNúmero da próxima atividade (destino).
WKCardIdCódigo do registro de formulário do processo.
WKFormIdCódigo do formulário do processo.
WKIdentityCompanyIdentificador da empresa selecionada para Experiências de uso TOTVS.
WKMobileIdentifica se a ação foi realizada através de um dispositivo mobile.
WKIsServiceIdentifica se a solicitação de cancelamento foi realizada através de um serviço. Esta variável só pode ser consultada nos eventos beforeCancelProcess e afterCancelProcess.
WKUserLocaleIdentifica o idioma corrente do usuário.
WKManagerModeIdentifica se o processo está sendo movimentado pela visão do gestor do processo ou não. Importante notar que esse parâmetro apenas retorna true/false caso o formulário esteja sendo movimentado por um processo workflow. Caso ele esteja sendo aberto e alterado pela navegação de documentos este parâmetro é nulo.
WKReplacement

Código do usuário substituto

Informações
titleObservação

Para processos que estejam sendo acessados por um usuário substituto, o usuário logado será o retorno do parâmetro WKReplacement

WKIsTransferBloqueia Permite verificar se o usuário de transferir uma atividadeestá ou não transferindo uma tarefa.


Além dessas propriedades já alimentadas pela plataforma, é possível criar propriedades desenvolvidas sob a plataforma que podem ser utilizadas nos eventos. O produto disponibiliza a variável globalVars, que é um mapa de dados (Map<String, String>) e estará disponível em todos os eventos.

...

Deck of Cards
effectDuration0.5
historyfalse
idsamples
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 desenvolvimento de um processo sob a plataforma:

Bloco de código
languagejavascript
themeEclipse
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 desenvolvimento sob a plataforma. 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
languagejavascript
themeEclipse
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 podem 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.

Bloco de código
languagejs
themeEclipse
firstline1
linenumberstrue
function afterProcessFinish(processId) {
	
	// Servico <url_fluig>/webdesk/ECMWorkflowEngineService?wsdl
	// Busca o webservice cadastrado com o código "WorkflowEngineService"
	var workflowEngineServiceProvider = ServiceManager.getServiceInstance("WorkflowEngineService");
	var workflowEngineServiceLocator = workflowEngineServiceProvider.instantiate("com.totvs.technology.ecm.workflow.ws.ECMWorkflowEngineServiceService");
	var workflowEngineService = workflowEngineServiceLocator.getWorkflowEngineServicePort();
 
	// Cria o ProcessAttachmentDtoArray
	var processAttachmentDtoArray = workflowEngineServiceProvider.instantiate("com.totvs.technology.ecm.workflow.ws.ProcessAttachmentDtoArray");

	// Cria o ObjectFactory
	var objectFactory = workflowEngineServiceProvider.instantiate("net.java.dev.jaxb.array.ObjectFactory");
	
	// Cria um String[][]
	var cardData = objectFactory.createStringArrayArray();
	
	// Cria uma solicitação
	workflowEngineService.simpleStartProcess("adm", "adm", 1, "process2", "Comment", processAttachmentDtoArray, cardData);	
}
Informações

Existem outros métodos parar iniciar uma solicitação, consulte-os aqui.

Lembre-se de consultar a classe ObjectFactory do serviço, essa classe possui diversos métodos para criar instância de objetos necessários para utilização do serviço.

Card
id4
labelExemplo 4

Exemplo para barrar o usuário de movimentar a solicitação com o campo "nome" vazio. Caso o mesmo salve a solicitação, a ação será permitida.

Bloco de código
languagejs
themeEclipse
firstline1
linenumberstrue
function beforeTaskSave(colleagueId, nextSequenceId, userList) {
	var completTask = getValue("WKCompletTask"); // 'true' - Completando a tarefa; 'false' - Salvando a tarefa
	var fieldName = hAPI.getCardValue("name");
 
	if (completTask == 'true' && (!fieldName || !fieldName.trim()) {
		throw("Não é permitido movimentar uma solicitação com o campo 'Nome' vazio!");
	}
}
Card
labelExemplo 5

Exemplo para bloquear que permite verificar se o usuário de transferir uma atividadeestá ou não transferindo uma tarefa:

Bloco de código
linenumberstrue
function beforeTaskCreate(colleagueId) {
	var isTransfer = getValue("WKIsTransfer");

	if (isTransfer !== null) {
		if (JSON.parse(isTransfer)) {
			throw "Não é permitido transferir a atividade!";
		}
	}
}