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 pela variável global hAPI. Os seguintes métodos estão disponíveis através da hAPI:
Método | Especificação | |||
---|---|---|---|---|
getCardValue("nomeCampo") | Permite acessar o valor de um campo do formulário do processo, onde:
| |||
setCardValue("nomeCampo", "valor") | Permite definir o valor de um campo do formulário do processo, onde:
| |||
setAutomaticDecision(numAtiv, listaColab, "obs") |
Permite definir o fluxo de saída de uma atividade de forma automática, onde:
| |||
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.
Exemplo de uso para esta função:
| |||
setDueDate(numProcesso, numThread, "userId", dataConclusao, tempoSeg) | Permite alterar o prazo de conclusão para uma determinada atividade do processo, onde:
| |||
transferTask(transferUsers, "obs", int numThread) | Transfere uma tarefa de um usuário para outro(s) usuário(s).
| |||
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:
| |||
startProcess(processId, ativDest, listaColab, "obs", completarTarefa, valoresForm, modoGestor) | Inicia uma solicitação workflow, onde:
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:
| |||
setTaskComments("userId", numProcesso, numThread, "obs") | Define uma observação para uma determinada tarefa do processo, onde:
| |||
getCardData(numProcesso) | Retorna um Mapa com todos os campos e valores do formulário da solicitação.
| |||
getAdvancedProperty("propriedade") | Retorna o valor da propriedade avançada de um processo.
| |||
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:
Retorno: Array de Objeto, onde a primeira posição do array é a data e a segunda a hora. Exemplo:
| |||
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:
Retorno: Array de Objeto, onde a primeira posição do array é a data e a segunda a hora. Exemplo:
| |||
getUserTaskLink(numAtiv) | Permite buscar o link para movimentação de uma determinada atividade, e utilizá-lo para enviar um e-mail com template personalizado, por exemplo.
Retorno: link para movimentação da solicitação.
Exemplo:
| |||
createAdHocTasks(workflowProcessInstanceId, sequenceId, assunto, detalhamento, listatvidadesAhoc) | Permite a criação de atividades adhoc dentro dos eventos do fluig
| |||
listAttachments() | Retorna a lista de anexos do processo. DocumentDto[ ] Veja aqui os paramêtros do objeto DocumentDto.
Exemplo:
| |||
publishWorkflowAttachment(documento) | Permite publicar anexos workflow da solicitação no GED do fluig, onde:
Exemplo:
| |||
attachDocument(documentId)
| Permite anexar documentos do GED a solicitação workflow, onde:
Exemplo:
| |||
getAvailableStatesDetail(companyId, userId, processId, processInstanceId, threadSequence) | Retorna detalhes das atividades disponíveis para seleção. Parâmetros:
Retorno: ProcessStateDto[]. | |||
getChildrenInstances(processInstanceId) | Retorna uma lista com os números das solicitações filhas, onde:
Exemplo:
| |||
getParentInstance(processInstanceId) | Retorna o número da solicitação pai, onde:
Exemplo:
| |||
addCardChild(tableName, cardData) | Adiciona um filho no formulário pai e filho do processo, onde:
Exemplo:
|
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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.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); } } |
Abaixo um outro exemplo utilizando o WebService ECMCardService para alterar o valor do campo de um registro de formulário após a entrada em uma nova atividade:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function afterStateEntry(sequenceId){ if (sequenceId == 2) { //Servico "<url_fluig>/webdesk/ECMCardService?wsdl"cadastrado com o código "CardService" var cardServiceProvider = ServiceManager.getServiceInstance( "CardService" ); var cardServiceLocator = cardServiceProvider.instantiate( "com.totvs.technology.ecm.dm.ws.ECMCardServiceServiceLocator" ); var cardService = cardServiceLocator.getCardServicePort(); var cardFieldDtoArray = cardServiceProvider.instantiate( "com.totvs.technology.ecm.dm.ws.CardFieldDtoArray" ); //Seta valor no campo com name = 'nome' cardField.setField( "nome" ); cardField.setValue( "Valor alterado via WS dentro de um evento workflow" ); var vetCardFields = new Array(); vetCardFields.push(cardField); cardFieldDtoArray.setItem(vetCardFields); //Altera o(s) campo(s) do registro de formulário. //updateCardData(tenantId, login, senha, codRegistroForm, cardFieldDtoArray); cardService.updateCardData(1, "adm" , "adm" , 8, cardFieldDtoArray); } } |
Os seguintes eventos são disparados pela API de Workflow:
Evento | Descrição | Parâmetros | ||
---|---|---|---|---|
afterCancelProcess | Ocorre após o cancelamento da solicitação. É recomendado não disparar exceções neste método, pois o cancelamento já foi realizado. |
| ||
afterProcessCreate | Ocorre logo após a criação de um novo processo.
|
| ||
afterProcessFinish | Ocorre após finalizada a solicitação. |
| ||
afterReleaseVersion | Ocorre após a liberação de uma versão do processo. |
| ||
afterStateEntry | Ocorre após a entrada em uma nova atividade. Este evento não retorna erros para a tela naturalmente. Caso ocorra um erro durante a execução do afterStateEntry, ele será ignorado. Se o mesmo erro resultar no encerramento da transação (por exemplo, causando o timeout de transação ou uma exceção que force Rollback) a mensagem de transação abortada será apresentada em tela ao invés do erro esperado. |
| ||
afterStateLeave | Ocorre após a saída de uma atividade. |
| ||
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. |
| ||
afterTaskCreate | Ocorre após o usuário receber uma tarefa. |
| ||
afterTaskSave | Ocorre após salvar as informações selecionadas pelo usuário. |
| ||
beforeCancelProcess | Ocorre antes do cancelamento da solicitação. |
| ||
beforeStateEntry | Ocorre antes da entrada em uma nova atividade. Dica Utilize este evento para realizar validações que ocasionalmente possam resultar no bloqueio da movimentação do processo. Para suspender a movimentação e exibir uma mensagem de alerta para o usuário, utilize o comando 'throw', conforme exemplo abaixo:
|
| ||
beforeStateLeave | Ocorre antes da saída de uma atividade. |
| ||
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. Observação Diferente dos demais eventos do tipo before, este evento não dispara suas validações ao servidor, fazendo com que o sistema não pare a movimentação da atividade quando o mesmo lança uma exceção. |
| ||
beforeTaskCreate | Ocorre antes que o usuário receba uma tarefa. |
| ||
beforeTaskSave | Ocorre antes de salvar as informações selecionadas pelo usuário. |
| ||
calculateAgreement | Ocorre após o cálculo do consenso (somente para atividades conjuntas) e permite alterar os dados do consenso de uma atividade. Exemplo:
|
| ||
onNotify | Se refere a um evento global que ocorre após a movimentação da solicitação e antes de enviar as notificações. | Para mais detalhes consulte a página Desenvolvimento de eventos - On Notify. | ||
setProcess | Ocorre quando um processo é "setado" na API. 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. |
| ||
subProcessCreated | Ocorre quando um sub-processo é criado. |
| ||
validateAvailableStates | Ocorre após montada a lista de tarefas disponíveis para o usuário a partir da tarefa atual.
Exemplo:
|
|
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 utilizada a seguinte lógica:
1 2 3 4 5 | function beforeStateEntry(sequenceId) { if (sequenceId != "NUMERO_DA_ATIVIDADE_INICIAL" ) { var campo = hAPI.getCardValue( "campo1" ); } } |