Árvore de páginas

Versões comparadas

Chave

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

Nas páginas abaixo dessa estrutura, é possível verificar as documentações para Desenvolvimento Workflow:

  • Tradução de Processos: Nesta página você pode verificar o sistema de tradução de processos do fluig. Acesse a documentação e confira mais informações.
  • Gestão de Lista de Tarefas: Configure listas a fim de organizar atividades diárias, permitindo informar qual atividade será desempenhada, quem desempenhará e o prazo de conclusão. Verifique o link da documentação e saiba mais detalhes.
  • Visão de utilização de workflows: Verifique as orientações e padrões a serem seguidos para a criação de workflows. Acesse o link da documentação e saiba mais detalhes.


Caso necessite utilizar integrações no seu workflow, acesse as páginas abaixo e verifique nossas documentações para obter mais informações:

...

  • hAPI: Permite verificar os métodos disponíveis. Acesse o link para conferir.
  • docAPI: Variável que permite acesso a funções relacionadas a documentos, podendo ser utilizada nos eventos. Acesse o link da documentação para visualizar os métodos disponíveis.
  • Mecanismo de atribuição: Permite que o usuário os utilize para criar uma lista de possíveis usuários para uma atividade. Acesse o link para ter acesso a todos os detalhes.
  • Mensagens de log para processos: Guia que permite auxiliar na ativação e compreensão do conjunto de mensagens de log que podem trazer informações sobre solicitações de processo. Acesse o link para conferir a documentação. 
  • Parâmetros: Permite conferir os tipos de parâmetros utilizados no desenvolvimento do processo sob a plataforma. Acesse o link para conferir mas informações.
  • Tratamento de exceções: Permite acessar os modelos de tratamentos de exceções para cada um dos eventos citados. Acesse o link e confira os modelos para utilização.
  • Eventos de processos: Permite visualizar todos os eventos e exemplos de implementação de cada um deles. Acesse o link da documentação e confira as informações de todos os eventos.
  • Eventos finais de processo: Permite visualizar a descrição dos tipos de eventos finais de um processo. Acesse o link da documentação e veja as informações referente a cada um deles.
  • Eventos de notificação: Guia que permite visualizar a configuração do widget específico e um evento de notificação. Acesse a documentação e confira os detalhes passo a passo.
  • Acompanhamento de eventos: Permite acompanhar a execução de eventos pelo componente loading. Acesse a documentação através do link e confira os exemplos de utilização deste componente.

Índice

 

Índice
outlinetrue
stylenone
exclude.*ndice

Customização de 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 em um 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 de um processo ou a entrada em uma nova atividade.

AQUI VAI CONTEÚDO FANTANTE

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:

MétodoEspecificação
getCardValue("nomeCampo")

Permite acessar o valor de um campo do formulário do processo, onde:

  • nomeCampo: nome do campo do formulário.
setCardValue("nomeCampo", "valor")

Permite definir o valor de um campo do formulário do processo, onde:

  • nomeCampo: nome do campo do formulário;
  • valor: valor a ser definido para o campo do formulário.
setAutomaticDecision(numAtiv, listaColab, "obs")

Permite definir o fluxo de saída de uma atividade de forma automática, onde:

  • numAtiv: número da atividade destino;
  • listaColab: lista (do tipo String) dos usuários que receberão a tarefa;
  • obs: observação da tarefa;
getActiveStates()Retorna uma lista das atividades ativas do processo.
getActualThread(numEmpresa, numProcesso, numAtiv)

Retorna a thread da atividade que está ativa, lembrando que em caso de atividades paralelas, retorna 0, 1, 2 e assim sucessivamente.

  • numEmpresa: número da empresa;
  • numProcesso: número da solicitação;
  • numAtiv: número da atividade.
setDueDate(numProcesso, numThread, "userId", dataConclusao, tempoSeg)

Permite alterar o prazo de conclusão para uma determinada atividade do processo, onde:

  • 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.
Informações

Recomendamos a utilização deste método no evento afterTaskCreate, pois será executado logo após a criação da tarefa. Exemplo:

Bloco de código
themeEclipse
languagejavascript
firstline1
linenumberstrue
function afterTaskCreate(colleagueId) {
	var data = new Date();
	
	//seta o dia, mês (Janeiro é 0) e ano
	data.setDate(20);
	data.setMonth(10);
	data.setFullYear(2010);
	   
	// Recupera o numero da solicitação
	var processo = getValue("WKNumProces");
	
	// Seta o prazo para as 14:00
	hAPI.setDueDate(processo, 0, colleagueId, data, 50400);
}
transferTask(transferUsers, "obs", int numThread)

Transfere uma tarefa de um usuário para outro(s) usuário(s).

  • transferUsers: lista (do tipo String) de usuários;
  • obs: a observação;
  • numThread: sequência da thread, em caso de atividades paralelas.
transferTask(transferUsers, "obs")

Transfere uma tarefa de um usuário para outro(s) usuário(s). Este método não pode ser usado em processos com atividades paralelas:

  • transferUsers: lista (do tipo String) de usuários;
  • obs: a observação.
startProcess(processId, ativDest, listaColab, "obs", completarTarefa, valoresForm, modoGestor)

Inicia uma solicitação workflow, onde:

  • processId: código do processo;
  • ativDest: atividade de destino;
  • listaColab: lista (do tipo String) de usuários;
  • obs: texto da observação;
  • completarTarefa: indica se deve completar a tarefa (true) ou apenas salvar (false);
  • valoresForm: um Mapa com os valores do formulário do processo;
  • modoGestor: acesso como gestor do processo (true/false).

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", numProcesso,  numThread, "obs")

Define uma observação para uma determinada tarefa do processo, onde:

  • 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, segundos, prazo, periodId)

Calcula um prazo a partir de uma data com base no expediente e feriados cadastrados no 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:

Bloco de código
themeEclipse
languagejavascript
firstline1
linenumberstrue
function afterTaskCreate(colleagueId) {
   	var data = new Date();

   	//Calcula o prazo
   	var obj = hAPI.calculateDeadLineHours(data, 50000, 2, "Default");
	var dt = obj[0];
	var segundos = obj[1];

   	//Recupera o numero da solicitação
   	var processo = getValue("WKNumProces");

   	//Altera o prazo do processo
	hAPI.setDueDate(processo,0,colleagueId, dt, segundos);
}
calculateDeadLineTime(data, segundos, prazo, periodId)

Calcula um prazo a partir de uma data com base no expediente e feriados cadastrados no 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:

Bloco de código
themeEclipse
languagejavascript
firstline1
linenumberstrue
function afterTaskCreate(colleagueId) {
	var data = new Date();
	//Calcula o prazo
	var obj = hAPI.calculateDeadLineTime(data, 50000, 120, "Default");
	var dt = obj[0];
	var segundos = obj[1];

	//Recupera o numero da solicitação
	var processo = getValue("WKNumProces");

	// Altera o prazo do processo
	hAPI.setDueDate(processo,0,colleagueId, dt, segundos);
}

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

Abaixo um exemplo de como executar o WebService de Colleague para criar um usuário no Fluig após executar uma tarefa:

Bloco de código
themeEclipse
languagejavascript
firstline1
linenumberstrue
function afterTaskComplete(colleagueId, nextSequenceId, userList) {
	
	if (nextSequenceId == 2) {
		//Busca o webservices de Colaborador
		var colleagueServiceProvider = ServiceManager.getServiceInstance("Colleague");
		var colleagueServiceLocator = colleagueServiceProvider.instantiate("com.totvs.technology.ecm.foundation.ws.ECMColleagueServiceService");
		var colleagueService = colleagueServiceLocator.getColleagueServicePort();
	
		//Cria o ColleagueDto – Verificar a lista de métodos na visualização do serviço
		var colleagueDto = colleagueServiceProvider.instantiate("com.totvs.technology.ecm.foundation.ws.ColleagueDto");
		colleagueDto.setCompanyId(1);
		colleagueDto.setColleagueId("teste");
		colleagueDto.setColleagueName("Usuario Teste");
		colleagueDto.setActive(true);
		colleagueDto.setVolumeId("Default");
		colleagueDto.setLogin("teste");
		colleagueDto.setMail("[email protected]");
		colleagueDto.setPasswd("teste");
		colleagueDto.setAdminUser(false);
		colleagueDto.setEmailHtml(true);
		colleagueDto.setDialectId("pt_BR");
		
		//Cria o colleagueDtoArray e adiciona
		var colleagueDtoArray = colleagueServiceProvider.instantiate("com.totvs.technology.ecm.foundation.ws.ColleagueDtoArray");
		colleagueDtoArray.getItem().add(colleagueDto);
	
		var result = colleagueService.createColleague("adm", "adm",  1, colleagueDtoArray);
		log.info("Result: " + result);
	}
}

Os seguintes eventos são disparados pela API de Workflow:

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).
beforeSendData----------
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>).  
Informaçõ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.
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

 

Tratamento de Exceções

Mecanismo de Atribuição

Como criar um Mecanismo de Atribuição

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

 

...

Customização de E-mail

 

...