Falando de componente Atividade de serviço...


O componente Atividade de serviço representa um ponto do processo onde será feita uma consulta aos dados de um serviço externo repassando esses dados para o processo.

A principal característica desse componente é sua capacidade de automatizar a execução de tarefas, facilitando a integração com sistemas externos e promovendo a eficiência do processo.

Ao configurar esse componente, é necessário selecionar um serviço já cadastrado na plataforma e editar um script JavaScript que fará o acesso aos métodos e dados desse serviço.

Os serviços são cadastrados no recurso Serviços do Painel de controle.

Com o uso das APIs hAPI e um formulário, é possível passar os dados obtidos na consulta do serviço para o processo.

Uma atividade de serviço pode ter apenas um fluxo de saída e deve ter um evento intermediário de captura de erro para onde a solicitação será enviada se ocorrer alguma inconsistência na execução do script.

A etapa posterior à captura de erro não é atribuída automaticamente a quem enviou a solicitação para a etapa correspondente à atividade de serviço. Por isso, é importante definir quem será a pessoa responsável pela etapa de tratamento do erro. Se não for definido um responsável, a etapa é enviada automaticamente para a primeira pessoa encontrada na lista de pessoas com cadastro ativo na plataforma em ordem alfabética, mesmo que essa pessoa não tenha nenhuma participação ou envolvimento no processo em questão.

Esse componente permite utilizar dois tipos de execução da consulta aos dados do serviço externo: a execução Automatizada e a execução Imediata, que são detalhadas a seguir.

** imagem**


Execução automatizada


A execução automatizada determina que a execução do script será feita de forma assíncrona e sem a necessidade de uma interação manual de uma pessoa. Nesse tipo de execução, é possível definir o número de tentativas de execução e uma mensagem de sucesso que será exibida quando a execução for concluída sem inconsistências.

Quando a solicitação chega em uma atividade de serviço com execução automatizada, ela fica parada nesse ponto até que o scritp seja executado com sucesso ou até que ele seja executado o número de vezes definido como tentativas de execução.

Se o script for executado com sucesso, a atividade de serviço é considerada concluída e a solicitação segue o seu fluxo de saída padrão. Porém, se o número de tentativas for atingido sem que haja uma execução do script com sucesso, a solicitação é movimentada para o evento intermediário de captura de erro que, por sua vez, movimentará a solicitação para o fluxo correspondente à etapa de tratamento do erro.

Em atividades de serviço com a forma de execução automatizada, é obrigatório o uso do evento intermediário de captura de erro anexado a ela, bem como um fluxo de saída deste evento, para permitir que o processo seja desviado quando o script de integração não for executado com sucesso em nenhuma das tentativas feitas.

O script da próxima execução – depois de uma execução com inconsistência – pode receber a quantidade de tentativas de execução e a mensagem da última execução como parâmetros, podendo ser utilizados dentro do script. Dessa forma, o script ficaria conforme o exemplo abaixo:

function servicetask9(attempt, message) {
    log.info("Exemplo servicetask");
    var a = hAPI.getCardValue("campo_no_formulario");
    if (a == "1") {
        return true;
    } else {
        throw "Exemplo de Erro";
    }
}

Tanto a mensagem de sucesso quanto as mensagens de inconsistências são salvas no histórico da solicitação como complementos, podendo ser vistas por quem tiver acesso à solicitação.


A execução automatizada deve ser utilizada quando a execução não necessita de um retorno imediato sobre a operação ter sido ou não executada com êxito. Essa execução é mais indicada para integração com serviços que podem ficar indisponíveis ou externos e que, necessariamente, devem ser assíncronos, fornecendo um fluxo de contingência quando a integração não for concluída com sucesso em nenhuma tentativa por qualquer motivo.

O fluxo de contingência é criado anexando um evento intermediário de captura de erro à atividade de serviço (o evento deve ser colocado em cima da atividade). Esse fluxo de saída será utilizando quando todas as tentativas de integração falharem.

** imagem de uma modelagem básica de uma tarefa de serviço do tipo Automática. **


Em um processo de Xxxxxxxxxxxx 



Execução imediata


A execução imediata determina que a execução do script será feita de forma síncrona, logo depois do evento afterStateEntry do processo em questão, ou seja, será executado no momento em que a solicitação chegar na atividade de serviço.

Quando o script for executado com sucesso, a solicitação é enviada imediatamente da atividade de serviço para a próxima etapa, dando continuidade ao fluxo de saída padrão. Porém, se ocorrer alguma inconsistência, esta forma de execução apenas retornará a inconsistência encontrada, mantendo a solicitação parada até que uma pessoa interaja na solicitação para averiguar e corrigir as inconsistências que ocorreram.

Esse é um exemplo de código para iniciar a integração com o serviço configurado no componente:

try {
    var Service = ServiceManager.getService('rm');
    var serviceHelper = Service.getBean();
    var serviceLocator = serviceHelper.instantiate('classe.locator');
} catch(erro) {
    log.error(erro);
}


A execução imediata deve ser utilizada quando a execução necessita de um retorno imediato sobre a operação para que o processo possa seguir adiante.

Atualmente, o tipo de execução imediata não é muito recomendado por ter seu desempenho reduzidos.


Em um processo de Aprovação de contrato, o solicitante preenche um formulário solicitando a criação do contrato com informações como o nome do fornecedor, o tipo e o número do contrato, a validade do contrato, dentre outras. Em seguida, o contrato passa por algumas etapas de aprovação e, depois de aprovado, precisa ser armazenado no recurso Documentos. É nesse ponto que pode ser incluído o componente atividade de serviço, para que uma pasta seja criada automaticamente para armazenar o contrato e os documentos relacionados.

Desta forma, quando a última etapa de aprovação for concluída, a solicitação seguirá para uma atividade de serviço que, utilizando as APIs da plataforma, criará a pasta no recurso Documentos com base nas informações fornecidas e nas permissões de acesso definidas no formulário, garantindo que a pasta será única para cada contrato.

Um exemplo de código que poderia ser utilizado como script na atividade de serviço é:

Esse é um exemplo que fica disponível no repositório SAMPLES e, por isso, ele pode ser atualizado lá a qualquer momento. Para ver sua versão mais recente e sempre atualizada, acesso-o a partir do repositório clicando aqui.

function servicetask9(attempt, message) {
	
	//Variáveis globais com os dados do formulário
	var FOLDER_NAME = hAPI.getCardValue("txtFolderName");
	var PARENT_FOLDER_CODE = hAPI.getCardValue("txtFolderCode");
	var GROUP_CODE = hAPI.getCardValue("txtGroupCode");
	var INHERIT_SECURITY = hAPI.getCardValue("cbxInheritSecurity") == "true";
	
	//Tipo de documento pasta
	var DOCUMENT_TYPE_FOLDER = "1";
	
	//Usuário logado
	var USER_LOGGED = getValue("WKUser");
	
	//Número da solicitação para comentário uso na descrição da pasta criada
	var REQUEST_NUMBER = getValue("WKNumProces");
	
	// Descrição da pasta criada
	var ADDITIONAL_COMMENTS = "This folder was created automatically from fluig BPM - request ";
	
	//Atribuições de segurança
	var USER_ATTRIBUTION_TYPE = 1;
	var GROUP_ATTRIBUTION_TYPE = 2;
	var ALL_USER_ATTRIBUTION_TYPE = 3; 
	
	//Níveis de segurança
	var READING = 0;
	var RECORDING = 1;
	var MODIFICATION = 2;
	var ALL = 3;
	
    try {
    	
    	//Instancia um novo documento e define as propriedades básicas
    	var dto = docAPI.newDocumentDto();
        dto.setDocumentDescription(FOLDER_NAME);
        dto.setAdditionalComments(ADDITIONAL_COMMENTS + REQUEST_NUMBER);
        dto.setDocumentType(DOCUMENT_TYPE_FOLDER);
        dto.setParentDocumentId(parseInt(PARENT_FOLDER_CODE));
        dto.setInheritSecurity(INHERIT_SECURITY);
        
        /*
         Como é possível definir várias permissões, é necessário criar um array com todas as permissões
         que serão aplicadas. Cada item do array é uma permissão ou restrição
        */
        var dtosSecurity = new Array();
        
        //Definindo permissão total para grupo
        var dtoGroupSecurity = docAPI.newDocumentSecurityConfigDto();
        dtoGroupSecurity.setAttributionType(GROUP_ATTRIBUTION_TYPE);
        dtoGroupSecurity.setAttributionValue(GROUP_CODE);
        dtoGroupSecurity.setPermission(true);
        dtoGroupSecurity.setShowContent(true);
        dtoGroupSecurity.setSecurityLevel(ALL);

        //Definindo permissão total para usuário
        var dtoUserSecurity = docAPI.newDocumentSecurityConfigDto();
        dtoUserSecurity.setAttributionType(USER_ATTRIBUTION_TYPE);
        dtoUserSecurity.setAttributionValue(USER_LOGGED);
        dtoUserSecurity.setPermission(true);
        dtoUserSecurity.setShowContent(true);
        dtoUserSecurity.setSecurityLevel(ALL);
        
      //Definindo permissão de modificação para todos os usuários
        var dtoAllUsersSecurity = docAPI.newDocumentSecurityConfigDto();
        dtoAllUsersSecurity.setAttributionType(ALL_USER_ATTRIBUTION_TYPE);
        dtoAllUsersSecurity.setAttributionValue(""); //Para todos os usuários deve-se passar vazio 
        dtoAllUsersSecurity.setPermission(true);
        dtoAllUsersSecurity.setShowContent(true);
        dtoAllUsersSecurity.setSecurityLevel(MODIFICATION);

      //Definindo restrição para usuário
        var dtoGroupRestrictionSecurity = docAPI.newDocumentSecurityConfigDto();
        dtoGroupRestrictionSecurity.setAttributionType(GROUP_ATTRIBUTION_TYPE);
        dtoGroupRestrictionSecurity.setAttributionValue(GROUP_CODE);
        dtoGroupRestrictionSecurity.setPermission(false);
        dtoGroupRestrictionSecurity.setShowContent(true);
        dtoGroupRestrictionSecurity.setSecurityLevel(MODIFICATION);
        
        //Definindo restrição para todos os usuários
        var dtoAllUsersRestrictionSecurity = docAPI.newDocumentSecurityConfigDto();
        dtoAllUsersRestrictionSecurity.setAttributionType(ALL_USER_ATTRIBUTION_TYPE);
        dtoAllUsersRestrictionSecurity.setAttributionValue("");
        dtoAllUsersRestrictionSecurity.setPermission(true);
        dtoAllUsersRestrictionSecurity.setShowContent(true);
        dtoAllUsersRestrictionSecurity.setSecurityLevel(RECORDING);
        
        //Adicionando permissões no array de segurança
        dtosSecurity.push(dtoGroupSecurity);        
        dtosSecurity.push(dtoUserSecurity);
        dtosSecurity.push(dtoAllUsersSecurity);

        //Adicionando restrições no array de segurança
        dtosSecurity.push(dtoGroupRestrictionSecurity);
        dtosSecurity.push(dtoAllUsersRestrictionSecurity);
       
        var FOLDER = docAPI.createFolder(dto, dtosSecurity, null);
        log.info("Folder successfully createad: ID :" + FOLDER.getDocumentId());
        
    } catch (e) {
        log.error("Could not create folder: \n" + e);
    }	
}

** imagem **


Configurar componente Atividade de serviço – Rest


01. No diagrama do processo, clique no componente Atividade de serviço que deseja configurar com um serviço do tipo Rest.

As configurações disponíveis são exibidas na lateral direita.

02. Na aba Geral, defina as informações gerais para o componente que representa uma consulta de dados de um serviço externo.

Título
Nome da etapa que representa uma consulta de dados de um serviço externo. O nome também pode ser alterado diretamente no componente, clicando sobre seu nome atual e depois em Editar– localizado no lado direito.


Em um processo de Aprovação de contrato, o componente poderia receber o nome Criar pasta, visto que ele servirá para criar uma pasta específica para armazenar esse contrato no recurso Documentos.

Selecione o serviço
Serviço que será utilizado para fazer a consulta de dados. É possível selecionar serviços do tipo Rest que já existem no recurso Serviços do Painel de controle.

Tipo de execução
Forma como a consulta aos dados do serviço externo será executada. As opções disponíveis são:

  • Automatizado: a consulta aos dados é executada de forma assíncrona. Deve ser utilizado quando a execução não necessita de um retorno imediato sobre a operação ter sido ou não executada com êxito;
  • Imediato: a consulta aos dados é executada de forma síncrona. Deve ser utilizado quando a execução necessita de um retorno imediato sobre a operação para que o processo possa seguir adiante.

    Saiba mais sobre os tipos de execução em Integração assíncrona via processos workflow.

Tentativas
Número de vezes que o componente deve tentar executar o script antes que seja encaminhado para o evento intermediário de captura de erro. Esse campo somente é exibido ao selecionar o tipo de execução Automatizado.

A cada
Intervalo que o componente deve considerar entre uma tentativa e outra de execução. Esse campo somente é exibido ao selecionar o tipo de execução Automatizado.

Frequência
Unidade de tempo que o componente deve considerar para fazer os intervalos e as tentativas de execução. Esse campo somente é exibido ao selecionar o tipo de execução Automatizado. As opções disponíveis são:

  • Minuto;
  • Hora;
  • Dia.


→ O componente deve tentar executar o script por 10 vezes, tentando 1 vez  a cada hora. Sendo assim, a configuração deve ser feita como:

TentativasA cadaFrequência
101Hora

Mensagem
Mensagem que será exibida na conclusão da execução do script de consulta ao serviço.

03. Clique em Configurar integração.

04. Na aba Geral, defina as informações solicitadas para configurar a integração com o serviço.

Selecione a ação (operação)
Método correspondente à ação que será feita a partir da integração com o serviço selecionado.

Defina o tempo de resposta
Tempo que a requisição pode aguardar para obter resposta do serviço selecionado.

Ativar conexão segura (SSL)
Quando ativada, determina que a comunicação com o serviço será segura e evitará que terceiros acessem os dados trocados durante a integração.


06. Xxxxxxxxxxxxxxx


07. Xxxxxxxxxxxxxxx


08. Xxxxxxxxxxxxxxx


09. Clique em Salvar rascunho – localizado no lado direito da barra superior – para salvar as configurações feitas no componente Atividade de serviço.

10. Na mensagem exibida, clique em Ok, entendi.


Configurar integração


01. No diagrama do processo, clique no componente Atividade de serviço para o qual deseja configurar a execução automatizada.



02. Clique em Adicionar condição.

03. Em Nome da condição, insira um nome para identificar a condição simples depois de criada.

04. Selecione o tipo Condição simples.

05. Xxxxxxx


06. Clique em Salvar.


07. Ao concluir a inclusão de todas as condições simples desejadas, clique em Fechar– localizado no canto superior direito.

08. Clique em Salvar rascunho – localizado no lado direito da barra superior – para salvar as alterações feitas no componente Atividade de serviço.

09. Na mensagem exibida, clique em Ok, entendi.



Editar integração


01. No diagrama do processo, clique no componente Exclusivo  do qual deseja editar uma condição simples.

02. Em Condições criadas, localize a condição que deseja editar e clique em Ações– localizado no seu lado direito.

03. Clique em Editar.

04. Xxxxxxxxxx.

09. Clique em Salvar rascunho – localizado no lado direito da barra superior – para salvar as alterações feitas no componente Atividade de serviço.

10. Na mensagem exibida, clique em Ok, entendi.


Dúvidas frequentes


Confira aqui algumas dúvidas frequentes sobre o componente Atividade de serviço.

<script>
    (function() {
        function toggleAreas(isExpand, $parent) {
            var $items = $parent.find('.panel');

            $.each($items, function(idx, el) {
                var $arrow = $(el).find('span.cloakToggle').find('span');
                var $content = $(el).find('span.cloak');
                if (isExpand) {
                    $arrow.removeClass('cloakDefaultOpen').addClass('cloakDefaultClose');
                    $content.show();
                } else {
                    $arrow.addClass('cloakDefaultOpen').removeClass('cloakDefaultClose');
                    $content.hide();
                }
            });
        }

        $(document).on('click', '#toggleAll-3', function(ev) {
            ev.preventDefault();
            var isExpand = $(this).data('expand');
            var $parent = $(this).nextAll('.sectionColumnWrapper').first();
            toggleAreas(isExpand, $parent);
            $(this).data('expand', !isExpand);
        });
    })();
</script>
<a id="toggleAll-3" href="#" data-expand="true">Abrir/fechar todas as dúvidas</a>

Quando se deve usar uma atividade de serviço?


A atividade de serviço é indicada quando o processo depende de dados externos oriundos de uma ação automatizada que pode ser executada sem a necessidade de interação direta de uma pessoa, tais como uma consulta a um banco de dados, uma chamada a uma API externa ou um cálculo automatizado.

Qual é a diferença da atividade de serviço e o evento de mensagem?


A principal diferença entre esses dois componentes é o papel de cada um. Enquanto a atividade de serviço executa uma ação específica – como uma consulta a um sistema externos – o evento de mensagem envia ou recebe uma mensagem durante o andamento do processo, o que pode desencadear uma ação em outro processo ou sistema.

Sendo assim, pode-se dizer que o evento de mensagem é mais voltado para a comunicação entre processos ou sistemas e a atividade de serviço tem como objetivo automatizar uma ação dentro do processo.

 O que acontece se uma atividade de serviço falhar ou gerar um erro?


  • Se a atividade de serviço foi configurada com a execução automatizada, é obrigatório que ela contenha um evento intermediário de captura de erro e um fluxo alternativo para onde a solicitação será direcionada em caso de falhas. Desta forma, quando a execução da atividade de serviço falhar, a solicitação será direcionada para o evento de captura de erro e, posteriormente, para o fluxo alternativo que direciona para uma etapa de tratamento da falha. Depois que a falha for solucionada, a solicitação volta para a atividade de serviço de origem e, assim que ela for executada com sucesso, segue o fluxo principal de saída.
  • Se a atividade de serviço foi configurada com a execução imediata, quando o script for executado com sucesso, a solicitação é enviada imediatamente da atividade de serviço para a próxima etapa, dando continuidade ao fluxo de saída padrão. Porém, se ocorrer alguma inconsistência, ela apenas retornará a inconsistência encontrada, mantendo a solicitação parada até que uma pessoa interaja na solicitação para averiguar e corrigir as inconsistências que ocorreram.

Xxxxxxxxxxxx?


Xxxxxxxxxxxx

 Xxxxxxxxxxxx?


Xxxxxxxxxxxxxx

 Xxxxxxxxxxxxx?


Xxxxxxxxxxxxxxx

Xxxxxxxxxxxx?


Xxxxxxxxxxxxx

Esta documentação é válida a partir da atualização 9.9.9 – Xxxxxxx. Se você utiliza uma atualização anterior, ela pode conter informações diferentes das quais você vê na sua plataforma.



<!-- Hotjar Tracking Code for http://tdn.totvs.com/display/fb -->
<script>
    (function(h,o,t,j,a,r){
        h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};
        h._hjSettings={hjid:1280165,hjsv:6};
        a=o.getElementsByTagName('head')[0];
        r=o.createElement('script');r.async=1;
        r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;
        a.appendChild(r);
    })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');
</script>