Árvore de páginas

Versões comparadas

Chave

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

...

Retorna o nível de permissão do usuário logado no documento informado, onde:

  • documentId: id do documento;
  • version: versão do documento;
    Exemplo de uso para esta função:

     

    MétodoEspecificação
    copyDocumentToUploadArea(documentId, version)

    Copia o arquivo físico os arquivos físicos de um documento existente para a área de upload do usuário logado, onde:

    • documentId: id do documento a ser copiado;
    • version: versão do documento a ser copiado;

    Retorno: Array de Strings contendo os nomes dos arquivos que foram disponibilizados na área de upload.

    createDocument(document, attachments, securityConfig, approvers, relatedDocs)

    Cria um novo documento no GED de acordo com os parâmetros enviados, onde:

    • document: documento a ser criado;
    • attachments: lista de anexos do documento;
    • securityConfig: lista de configurações de segurança do documento;
    • approvers: lista de aprovadores do documento;
    • relatedDocs: lista de documentos relacionados ao documento;

    Retorno: DocumentDto do documento criado.

    createFolder(document, securityConfig, approvers)

    Cria uma nova pasta no GED de acordo com os parâmetros enviados, onde:

    • document: pasta a ser criada;
    • securityConfig: lista de configurações de segurança da pasta;
    • approvers: lista de aprovadores da pasta;

    Retorno: DocumentDto da pasta criada.

    getDocumentVersion(documentId, version)

    Retorna o DocumentDto de um documento com base no seu id e sua versão, onde:

    • documentId: id do documento a ser retornado;
    • version: versão do documento a ser retornado;

     

    getUserPermissions(documentId, version)
    Bloco de código
    themeEclipse
    languagejavascript
    firstline1
    linenumberstrue
    function afterTaskCreate(colleagueId) {
    
        var nrProxAtividade = getValue("WKNextState");
        if (nrProxAtividade == "5"){ //atividade entre paralelas
     
    		var data = new Date();
    		var numEmpresa = getValue("WKCompany");
    	
    		//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 numProcesso = getValue("WKNumProces");
    	
    		// Seta o prazo para as 14:00
    		hAPI.setDueDate(numProcesso, hAPI.getActualThread(numEmpresa, numProcesso, nrProxAtividade), colleagueId, data, 50400);
    	}
    }
    isUserInGroup(group)

    Retorna se o usuário logado faz parte do grupo informado, onde:

    group: código do grupo a ser verificado;
    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);
    }
    newAttachment()

    Retorna uma nova instância de Attachment.

    newRelatedDocumentDto()

    Retorna uma nova instância de RelatedDocumentDto.

    newDocumentSecurityConfigDto()

    Retorna uma nova instancia de DocumentSecurityConfigDto.

    newApproverDto()

    Retorna uma nova instância de ApproverDto.

    newDocumentDto()

    Retorna uma nova instância de DocumentDto, com o tipo 2 (Documento) como padrão.

     

    Desenvolvimento de processo sob a plataforma

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

    • validar o ato de completar uma atividade;
    • tomar decisões automaticamente;
    • realizar integrações com outros sistemas;
    • iniciar novas solicitações automaticamente.

    Existem algumas propriedades que contém informações referentes à solicitação que podem ser utilizadas no desenvolvimento do processo sob a plataforma, são elas:

    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.
    WKUserCommentComentário feito pelo usuário na atividade ou no cancelamento da solicitação.
    WKCompletTaskSe a tarefa foi completada (true/false).
    WKNextStateNúmero da próxima atividade (destino).
    WKCardIdCódigo do formulário do processo.
    WKFormIdCódigo da definição de 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.

     

    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.

    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");

    ...

    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 desenvolvimento de um processo sob a plataforma:

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

    Exemplo de utilização desta função em conjunto com a função copyDocumentToUploadArea:

    Bloco de código
    themeEclipse
    languagejavascript
    firstline1
    linenumberstrue
    function beforeStateEntry(sequenceId) {
    
    	if (sequenceId == 5) {
    		var attachments = hAPI.listAttachments();
    		for ( var i = 0; i < attachments.size(); i++) {
    			var docDto = attachments.get(i);
    
    			if (docDto.getDocumentType() == "7") {
    				
    				docAPI.copyDocumentToUploadArea(docDto.getDocumentId(), docDto.getVersion());
    		
    				docDto.setDocumentId(0);
    				docDto.setParentDocumentId(20);
    		
    				var attachArray = new java.util.ArrayList();
    				var mainAttach = docAPI.newAttachment();
    				mainAttach.setFileName(docDto.getPhisicalFile());
    				mainAttach.setPrincipal(true);
    				mainAttach.setAttach(false);
    				attachArray.add(mainAttach);
    		
    				try {
    					var doc = docAPI.createDocument(docDto, attachArray, null, null,null);
    					log.info("DOCUMENTO CRIADO COM O ID: " + doc.getDocumentId());
    				} catch (e) {
    					log.error("Problemas na criação do documento:\n" + e);
    				}
    			}
    		}
    	}
    }
    createFolder(document, securityConfig, approvers)

    Cria uma nova pasta no GED de acordo com os parâmetros enviados, onde:

    • document: pasta a ser criada;
    • securityConfig: lista de configurações de segurança da pasta;
    • approvers: lista de aprovadores da pasta;

    Retorno: DocumentDto da pasta criada.

    Exemplo de utilização desta função:

    Bloco de código
    themeEclipse
    languagejavascript
    firstline1
    linenumberstrue
    function afterProcessFinish(processId) {
    	try {
    		var dto = docAPI.newDocumentDto();
    		dto.setDocumentDescription("Planilhas");
    		dto.setDocumentType("1");
    		dto.setParentDocumentId(20);
    		dto.setDocumentTypeId("");
    		
    		var folder = docAPI.createFolder(dto, null, null);
    		log.info("PASTA CRIADA COM O ID :" + folder.getDocumentId());
    	} catch (e) {
    		log.error("Problemas na criação da pasta:\n" + e);
    	}
    }
    
    getDocumentVersion(documentId, version)

    Retorna o DocumentDto de um documento com base no seu id e sua versão, onde:

    • documentId: id do documento a ser retornado;
    • version: versão do documento a ser retornado;

     

    getUserPermissions(documentId, version)

    Retorna o nível de permissão do usuário logado no documento informado, onde:

    • documentId: id do documento;
    • version: versão do documento;

    isUserInGroup(group)

    Retorna se o usuário logado faz parte do grupo informado, onde:

    • group: código do grupo a ser verificado;
    newAttachment()

    Retorna uma nova instância de Attachment.

    newRelatedDocumentDto()

    Retorna uma nova instância de RelatedDocumentDto.

    newDocumentSecurityConfigDto()

    Retorna uma nova instancia de DocumentSecurityConfigDto.

    newApproverDto()

    Retorna uma nova instância de ApproverDto.

    newDocumentDto()

    Retorna uma nova instância de DocumentDto, com o tipo 2 (Documento) como padrão.

     

    Desenvolvimento de processo sob a plataforma

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

    • validar o ato de completar uma atividade;
    • tomar decisões automaticamente;
    • realizar integrações com outros sistemas;
    • iniciar novas solicitações automaticamente.

    Existem algumas propriedades que contém informações referentes à solicitação que podem ser utilizadas no desenvolvimento do processo sob a plataforma, são elas:

    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.
    WKUserCommentComentário feito pelo usuário na atividade ou no cancelamento da solicitação.
    WKCompletTaskSe a tarefa foi completada (true/false).
    WKNextStateNúmero da próxima atividade (destino).
    WKCardIdCódigo do formulário do processo.
    WKFormIdCódigo da definição de 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.

     

    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.

    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");

    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 desenvolvimento de um processo sob a plataforma:

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

    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.

    Abaixo é apresentado os modelos para utilização em cada um dos eventos

    ...

    id3
    labelExemplo 3

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

    ...

    Bloco de código
    themeEclipse
    languagejs
    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.

    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.

    Abaixo é apresentado os modelos para utilização em cada um dos eventos:

    Bloco de código
    themeEclipse
    languagejavascript
    firstline1
    linenumberstrue
    function beforeStateEntry(sequenceId) {
    	var activity = getValue("WKNumState");
    	if (activity == 0 || activity == 1) {
    		//Outra condição.
    		throw "TRATAMENTO DE 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 DE EXCEÇÃO";
    }

     

    É 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 propriedade WKUserComment no evento beforeTaskSave ou no evento beforeCancelProcess. Exemplo:

    Bloco de código
    themeEclipse
    languagejavascript
    firstline1
    linenumberstrue
    function beforeTaskSave(colleagueId, nextSequenceId, userListbeforeStateEntry(sequenceId) {
    	ifvar activity = (getValue("WKUserCommentWKNumState");
    	if (activity == null0 || getValue("WKUserComment")activity == ""1) {
    		//Outra condição.
    		throw "ATRATAMENTO observação deve ser preenchidaDE EXCEÇÃO";
    	}	
    }
    
    function beforeCancelProcessbeforeTaskSave(colleagueId, processIdnextSequenceId, userList) {
    	ifvar activity = (getValue("WKUserCommentWKNumState");
    	if (activity !== null0 || getValue("WKUserComment") == ""&& activity != 1) {
    		//Outra condição
    		throw "ATRATAMENTO observação deve ser preenchidaDE EXCEÇÃO";
    	}
    }
    
    function beforeCancelProcess(colleagueId, processId) {
    	//Condição.
    	throw "TRATAMENTO DE 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 usuários 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 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.

    O fluig possui alguns mecanismos de atribuição padrão, conforme abaixo:

    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.

    Utilize o passo-a-passo para conhecer o processo de criação de um mecanismo de atribuição de exemplo:

     

     

    É 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 propriedade WKUserComment no evento beforeTaskSave ou no evento beforeCancelProcess. Exemplo:

    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:

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

    O fluig possui alguns mecanismos de atribuição padrão, conforme abaixo:

    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.

    Utilize o passo-a-passo para conhecer o processo de criação de um mecanismo de atribuição de exemplo:

     

    Por fim, o mecanismo de atribuição desenvolvido sob a plataforma 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:

    Image Removed

     

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

     

    Para criar um novo mecanismo de atribuição desenvolvido sob a plataforma, 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:

    Image Removed

     

    Card
    id2
    label2º Passo

     

    O assistente Novo mecanismo fluig é aberto. Informar o código e uma descrição e clicar no botão Finish:

    Image Removed

     

    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 mecanismo de atribuição desenvolvido sob a plataforma 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 no desenvolvimento do mecanismo de atribuição sob a plataforma.

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

     

    Parâmetros workflow para desenvolvimento de formulários sob a plataforma

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

    ParâmetroDescrição
    WKDefCódigo do processo.
    WKVersDefVersão do processo.
    WKNumProcesNúmero da solicitação de processo.
    WKNumState

    Número da atividade movimentada.

    WKCurrentState

    Número da atividade atual.

    WKCompanyNúmero da empresa.
    WKUserCódigo do usuário corrente.
    WKCompletTaskSe a tarefa foi completada (true/false).
    WKNextStateNúmero da próxima atividade (destino).
    WKCardIdCódigo do formulário do processo.
    WKFormIdCódigo da definição de formulário do processo.
    WKIdentityCompanyIdentificador da empresa selecionada para Experiências de uso TOTVS.

     

    Nos scripts dos eventos da definição de formulário basta recuperar as informações com o comando getValue, conforme exemplo:

    Bloco de código
    themeEclipse
    languagejavascript
    var vCodProcess = getValue("WKDef");

     

    Funções JavaScript para validações na camada de interface de formulário

    Em processos que possuem um formulário desenvolvido sob a plataforma é possível implementar funções JavaScript dentro do formulário, para serem executadas automaticamente durante a movimentação do processo.

     

    Estão disponíveis:

    true
    id1
    label1º Passo

     

    Para criar um novo mecanismo de atribuição desenvolvido sob a plataforma, 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:

    Image Added

     

    Card
    id2
    label2º Passo

     

    O assistente Novo mecanismo fluig é aberto. Informar o código e uma descrição e clicar no botão Finish:

    Image Added

     

    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 mecanismo de atribuição desenvolvido sob a plataforma 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 no desenvolvimento do mecanismo de atribuição sob a plataforma.

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


    Por fim, o mecanismo de atribuição desenvolvido sob a plataforma 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:

    Image Added

     

     

    Parâmetros workflow para desenvolvimento de formulários sob a plataforma

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

    ParâmetroDescrição
    WKDefCódigo do processo.
    WKVersDefVersão do processo.
    WKNumProcesNúmero da solicitação de processo.
    WKNumState

    Número da atividade movimentada.

    WKCurrentState

    Número da atividade atual.

    WKCompanyNúmero da empresa.
    WKUserCódigo do usuário corrente.
    WKCompletTaskSe a tarefa foi completada (true/false).
    WKNextStateNúmero da próxima atividade (destino).
    WKCardIdCódigo do formulário do processo.
    WKFormIdCódigo da definição de formulário do processo.
    WKIdentityCompanyIdentificador da empresa selecionada para Experiências de uso TOTVS.

     

    Nos scripts dos eventos da definição de formulário basta recuperar as informações com o comando getValue, conforme exemplo:

    Bloco de código
    themeEclipse
    languagejavascript
    var vCodProcess = getValue("WKDef");

     

    Funções JavaScript para validações na camada de interface de formulário

    Em processos que possuem um formulário desenvolvido sob a plataforma é possível implementar funções JavaScript dentro do formulário, para serem executadas automaticamente durante a movimentação do processo.

     

    Estão disponíveis:

    É executada quando o usuário pressiona o botão Movimentar antes de serem exibidas as opções de movimentação do processo.

    FunçãoDescrição
    beforeMovementOptions

    É executada quando o usuário pressiona o botão Movimentar antes de serem exibidas as opções de movimentação do processo.

    Nota

    Se o fluxo não necessitar da interação do usuário, este método não será executado!  

     

    Parâmetros:

      • numState: número da atividade atual.

    Opcionais:

      • return false: impedirá a execução do processo. Esta opção permite que sejam exibidos erros personalizados no formulário.
      • throw(“Erro”): impedirá a execução e exibirá uma tela de erro padrão do fluig com o texto informado.

    Exemplo:

    Bloco de código
    themeEclipse
    languagejs
    firstline1
    linenumberstrue
    var beforeMovementOptions = function(numState){
    	console.log("-beforeMovementOptions-");
    	console.log("numState: " + numState);	
    	console.log("valor campo Email: " +document.formulario.email.value);
    	if(document.cad01.nome.value === 'false'){
    		return false;
    	}
    	if(document.cad01.nome.value !== ''){
    		throw("Erro " + document.formulario.nome.value);
    	}
    }
    beforeSendValidate

    Ocorre antes da solicitação ser movimentada, após já ter sido selecionada a atividade destino, o usuário e demais informações necessárias à solicitação.

    Parâmetros:

      • numState: número da atividade atual.
      • nextState: número da atividade destino
    FunçãoDescrição
    beforeMovementOptions
    Nota

    Se o fluxo não necessitar da interação do usuário, este método não será executado!  

     

    Parâmetros:

    numState: número da atividade atual
      • .

    Opcionais:

      • return false: impedirá a execução do processo. Esta opção permite que
    sejam exibidos erros personalizados
      • seja exibido um erro personalizado no formulário.
      • throw(“Erro”): impedirá a execução e exibirá uma tela de erro padrão do fluig com o texto informado.

    Exemplo:

    Bloco de código
    themeEclipse
    languagejs
    firstline1
    linenumberstrue
    var 
    beforeMovementOptions
    beforeSendValidate = function(numState,nextState){
    	console.log("-
    beforeMovementOptions
    beforeSendValidate-");
    	console.log("numState: " + numState);
    
    	console.log("
    valor campo Email
    nextState: " +
    document.formulario.email.value
     nextState);	
    	
    if(document.cad01.nome.value === 'false'){ return false; } if(document.cad01.nome.value !== ''){ throw("Erro " + document.formulario.nome.value); } }beforeSendValidate

    Ocorre antes da solicitação ser movimentada, após já ter sido selecionada a atividade destino, o usuário e demais informações necessárias à solicitação.

    Parâmetros:

      • numState: número da atividade atual.
      • nextState: número da atividade destino.

    Opcionais:

      • return false: impedirá a execução do processo. Esta opção permite que seja exibido um erro personalizado no formulário.
      • throw(“Erro”): impedirá a execução e exibirá uma tela de erro padrão do fluig com o texto informado.

    Exemplo:

    Bloco de código
    themeEclipse
    languagejs
    firstline1
    linenumberstrue
    var beforeSendValidate = function(numState,nextState){
    	console.log("-beforeSendValidate-");
    	console.log("numState: " + numState);
    	console.log("nextState: " + nextState);	
    	throw("Erro Xyz");
    }

     

     

    Nota
    titleMais informações

    Sobre personalização de notificações e e-mail acompanhe informações detalhadas em:

     

     

    ...

    throw("Erro Xyz");
    }

     

     

    Nota
    titleMais informações

    Sobre personalização de notificações e e-mail acompanhe informações detalhadas em:

     

     

     

     beforeStateEntry(sequenceId) {
        if (sequenceId == 2) {
            var numProcess = getValue("WKNumProces");
        
            // Busca o número da solicitação pai
            var parentProcess = hAPI.getParentInstance(numProcess);
     
            // Busca os dados do formulário da solicitação pai
            var parentCardData = hAPI.getCardData(parentProcess);
     
            // Replica um dado do formulário da solicitação pai para o formulário da solicitação filha
            var cnpj = parentCardData.get("cnpj");
            hAPI.setCardValue("cnpj", cnpj);
        } 
    }