Pesquisa por:
Capturar erros em webservices de Fórmulas Visuais.

Ao criar datasets é comum que gerem erros, pois podem acontecer situações de gerar exceções como por exemplo falhas de comunicação com o webservice, autenticação, entre outros.

Quando há a comunicação com fórmulas visuais o erro pode ser customizado, que é no momento onde geramos uma atividade de excessão.

Após diversos testes identifiquei que o código abaixo retorna a estrutura da Tag DataSetXML

   var result = authService.execute(codcoligada, idformulavisual, contexto, '',  xml, '');    		

Quando gera-se uma exceção em fórmula visual o conteúdo da mensagem é explícito na tag ErrorMessage

Para entender o funcionamento foi feita a seguinte análise, veja o código abaixo.

 

var servico = ServiceManager.getServiceInstance(NOME_SERVICO);
		            var serviceHelper = servico.getBean();
		            var instancia = servico.instantiate(CAMINHO_SERVICO);
		            var ws = instancia.getRMIwsFormulaVisual();
		            var instanciaError = instancia.getRMIwsFormulaVisual();
		            
		            
		            var authService = serviceHelper.getBasicAuthenticatedClient(ws, "com.totvs.IwsFormulaVisual", 'mestre', 'senha');
		            
		            var xml = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tot="http://www.totvs.com/"> ' +
		            '<soapenv:Header/> ' +
		            '<soapenv:Body> ' +
		            '   <tot:Execute> ' +
		            '      <!--Optional:--> ' +
		            '      <tot:codColigada>1</tot:codColigada> ' +
		            '      <!--Optional:--> ' +
		            '      <tot:idFormula>9</tot:idFormula> ' +
		            '      <!--Optional:--> ' +
		            '      <tot:context>codusuario="mestre";codcoligada=1</tot:context> ' +
		            '   </tot:Execute> ' +
		           ' </soapenv:Body>' +
		         ' </soapenv:Envelope> ' ;
		            
		            
		            
		            var contexto = 'CODCOILIGADA=1;CODFILIAL=1;CODUSUARIO=Usuario;CODSISTEMA=G';
		            var result = authService.execute(codcoligada, idformulavisual, contexto, '',  xml, '');    	

Instanciamos uma variável chamada authService, nesta variável definimos qual objeto iremos acessar, neste caso é o ‘com.totvs.IwsFormulaVisual’.

 var authService = serviceHelper.getBasicAuthenticatedClient(ws, "com.totvs.IwsFormulaVisual", 'mestre', 'senha');

Após isso, foi observado dentro do Eclipse todos os métodos que compõem esta Interface.

Logo em seguida chamamos o método result = authService.execute , este método retorna um objeto do tipo ConWSFormulaVisualResult .

Ao analisar a classe ConWSFormulaVisualResult verifiquei que existe um método do tipo getErrorType() e getErrorMessage() , ambas retornam objeto do tipo java.xml.bind.JAXBElement<String>

Por fim, em um contexto que a fórmula visual gera uma exceção, podemos perceber os valores destas duas tags abaixo: 

O método getValue é o gerado pela classe JAXBElement, que pode ser visto neste link.

log.info('getErrorMessage() ' + result.getErrorMessage().getValue());
//Gera o resultado 
//ERRO - Fórmula Visual: 'TESTE FORMULA VISUAL'.



log.info('getErrorMessage() ' + result.getErrorType().getValue());
//RM.Lib.Workflow.RMSWorkflowException




Referências

https://docs.oracle.com/javaee/7/api/javax/xml/bind/JAXBElement.html

Validar data no fluig em datasets e eventos de processos e formulários.

Uma forma básica para validar se uma variável é do tipo DATA é tentar converter esta variável utilizando o DateTimeFormatter e LocalDate do Java.

Segue abaixo um exemplo de erro ao tentar converter data no fluig e em seguida um exemplo de sucesso na verificação da data.

Exemplo – Erro.
Exemplo – sucesso.

/**
*  Exemplo de uso
*  if(isValidDate("dd/MM/yyyy", "Data Nascimento", "18/12/1991"))
*
**/
function isValidDate(date_format, field_name, date){	
	try{
	  var df = java.time.format.DateTimeFormatter.ofPattern(date_format);
	  var convert = java.time.LocalDate.parse(date, df);
	}catch(e){
		throw "erro ao validar o campo " + field_name + ". Detalhes - " + e;
	}
	return true;
}
Enviando e-mail pelo Fluig.

Objetivo

Iremos construir um template que seja possível enviar lista de dados para melhor otimizar nosso template e código.

O artigo oficial de envio de e-mail pelo Fluig está disponível neste link, portanto o que irei destacar abaixo foram resultados de observações e estudos.

O objetivo deste estudo é entender quais tecnologias o Fluig utiliza para entregar a solução de E-mail e do Template de E-MAIL e estudar uma forma mais limpa de construir os templates.

Utilize estas informações para agregar em seus estudos, porém sempre que houver dúvidas consulte o suporte e documentação oficial do Fluig.

Disclaimer: as ações são responsabilidades dos usuários.

Caso seu fluig não dispare os e-mails consulte a documentação: fluig não dispara e-mail.

Freemarker

O freemarker é uma tecnologia em java para construção de templates, é bem utilizado nas construções de widgets.

Fazer um bom uso do FreeMarker com certeza gera ganhos em produtividade e manutenção de códigos.

Recomendo a leitura neste link: https://freemarker.apache.org/docs/ref_directive_list.html

Enviar o E-mail pelo Fluig

Para enviar o E-mail pelo Fluig é necessário utilizar o recurso onNotify, confira de forma detalhada neste link: https://tdn.totvs.com/display/public/fluig/Templates+de+e-mail+personalizado

Resultado Final

Ao executar o passo a passo abaixo você deverá ter um resultado semelhante a este:


Passo a Passo

Evento de Processo

Crie um processo e acrescente o código abaixo em um evento de processo, como por exemplo: o BeforeStateEntry

Veja abaixo que estamos utilizando a variável UFS e a variável CarrosList, desta forma enviamos a lista de objetos que será lida pelo FreeMarker.

try{
	    //Monta mapa com parâmetros do template
	    var parametros = new java.util.HashMap();
	    
	  
	    
	    //Veja mais detalhes em: 
	    parametros.put("NOME_USUARIO", "UsuarioFluig");
	    parametros.put("CODIGO_USUARIO", "UsuarioFluig");
	    parametros.put("calculo", 1+1);
	    parametros.put("SERVER_URL",    fluigAPI.getPageService().getServerURL()  ) ;
	    
//E-mail
	    parametros.put("subject", "Assunto do E-mail");
	     
	     var ufs = new java.util.ArrayList();
	     ufs.add("GO");
	     ufs.add("SP");
	     ufs.add("AC");
	     
	     
	     var carrosList = new java.util.ArrayList();
	     
	     var carro = new java.util.HashMap();
		   
	     carro.put("modelo", "GOL");
	     carro.put("cor", "BRANCO");
	     carro.put("motor", "1.0");
	     
	     carrosList.add(carro);
	     
	     var carro = new java.util.HashMap();
	     
	     carro.put("modelo", "Civic");
	     carro.put("cor", "cinza");
	     carro.put("motor", "5.0");
	     
	     carrosList.add(carro);
	     
	     var carro = new java.util.HashMap();
	     
	     carro.put("modelo", "PALIO");
	     carro.put("cor", "verde");
	     carro.put("motor", "1.5");
	     
	     carrosList.add(carro);
	     
	     var carro = new java.util.HashMap();
	     
	      
	    
	    parametros.put("estados", ufs);
	    parametros.put("carros", carrosList);
	 
	    //Monta lista de destinatários
	   
	    
	    var destinatarios = new java.util.ArrayList();
	    
	    
	    destinatarios.add("[email protected]");
	    
	    	//Envia e-mail
	    	notifier.notify("UsuarioFluig", "template_teste", parametros, destinatarios, "text/html");
	    
	     
	} catch(e){
		throw e;
	    log.info(e);
	}

Após criar o processo crie um novo arquivo html chamado template_teste.html e salve ele em seu computador, em seguida acesse o fluig > Painel de Controle > Templates de E-mail e crie um template importando este arquivo html.

HTML – Template de E-mail Fluig

Veja que as variáveis são passadas dentro deste bloco ${estado} , onde neste exemplo o estado é o nome do meu objeto no evento de processo, que foi recebido na variável de parametros.

Eu recomendo que teste utilizar da seguinte forma, ${estado!”}, pois assim a variável estado se não existir irá imprimir um valor em branco.

Este tipo de situação acontece, onde a variável pode não ter sido gerada corretamente, principalmente em elementos do tipo lista e geração dinâmica.

Utilizar este modelo onde substitui a inexistência da variável por um valor em branco pode suprimir erros, pois no primeiro exemplo, caso a variável estado não exista poderá haver erros na geração e disparo do e-mail.



Este é um exemplo de envio de e-mail  <br/> <br/>

A soma de 1 + 1 é ${calculo}  <br/> <br/>

A url do fluig é: <a href="${SERVER_URL!''}"  <br/> <br/>



<html>
	<#if estados??> 
	<tr>
		<td>UF ( Estado )</td>
	</tr>

	<#list estados as estado>
	<tr>		
       <td>
		  ${estado!''}
	    <td>
	</tr>
		</#list>
	</#if>
</html>

-------------------------------------------

LISTA DE CARROS

-------------------------------------------

<#if carros??> 
<html>
	<tr>
		<td>Marca</td>
		<td>Cor</td>
		<td>Motor</td>
	</tr>
	<#list carros as carro>
	<tr>
		<td>${carro.modelo!''}</td>
		<td>${carro.cor!''}</td>
		<td>${carro.motor!''}</td>
	</tr>
	</#list>
	</tr>
</html>
</#if>

Referências

Acessos em: 10 de ago. 2021.

https://freemarker.apache.org/docs/ref_directive_list.html
https://api.fluig.com/old/sdk/com/fluig/sdk/service/PageService.html
https://fluiggers.com.br/t/como-pegar-url-do-ambiente-fluig-que-estou/157/7

Pai x Filho Fluig – Dicas de Uso.

Como somar números dentro do pai x filho do fluig

Exemplo de como somar itens dentro da tabela pai x filho do fluig.


/**
 * 
 * Criar três campos do tipo input chamados n1, n2 e total em uma tabela pai x filho
 * Opção 01 - Criar um botão para calcular e chamar o evento onclick='calcular(this);'
 * Opção 02 - Nos campos n1 e n2 adicionar um evento onchange='calcular(this);'
 */



function calcular(obj){
    var util = new Util();
    var i = util.IndicePaiFilho(obj);

    var n1 = util.ItensPaiFilho("input","n1", i).val();
    var n2 = util.ItensPaiFilho("input","n2", i).val();

    util.ItensPaiFilho("input","total", i).val(n1 + n2);


}



//Classe Utilidade
class Util {


     // Obter os campos pai x filho do formulário.
     ItensFormulario(field_type,field_name){
        return $(`${field_type}[name='${field_name}']`) ;
      }

    //Envia o campo e ele retorna o indice do campo.
    IndicePaiFilho(obj){
     return  $(obj).attr('name').split("___")[1] ;
    
    }
    
    // Obter os campos pai x filho do formulário.
    ItensPaiFilho(field_type,field_name,field_index){
      return $(`${field_type}[name='${field_name}___${field_index}']`) ;
    }
    
    
    
    }

Como manipular um elemento do tipo select dentro do pai x filho do fluig com javascript?



 window.onload = function(){
 
 
    //varrer todo campo com o ID abaixo
   select=$("select[id*='sel_campo___'] ");

   //Quebrar todos os campos em um array.
   select.toArray().forEach((k,v)=>{
       
     //imprimir o objeto K
    console.log(k);

    //analisar o valor do campo.
    if(k.value=='sim'){  
       //para cada campo analisar a opção do campo select.   
       for(i=0;i<k.options.length;i++){
        
       //imprimir o objeto K que é o principal
       console.log(k[i]); 

       // obter o Index da tabela pai x filho daquele elemento
       var i = $(k).attr('id').split("___")[1];
       
       // acessar outro campo qualquer do campo pai x filho
       console.log($("input[name="campoQualquer___" + i).val() ); 

       
        if(k[i].value!='conforme'){
         k[i].disabled='disabled';
    }
   }
     }else if(k.value=='nap'){     
   for(i=0;i<k.options.length;i++){
      console.log(k[i]); 
      if(k[i].value!='tratado'){
         k[i].disabled='disabled'       
     }
   }
 }
 

 });
 }
 }
Campo Pai X Filho do fluig não carrega os valores nos itens.

Ao tentar carregar na tela os resultados do valor de um campo pai x filho de alguma forma os campos não são preenchidos. Isso pode ser algum erro na estrutura do seu HTML.

O erro acontece quando você salva o formulário e tenta abri-lo, o sistema não preenche todos os campos INPUTS para a apresentação.

Internamente o fluig armazena as informações, mas durante o carregamento da tela ele não gera os IDS dos campos, por isso ele não acha as referências para gerar a informação na tela, resultando assim em um campo vazio.

Este erro impacta na geração do atributo ID dos campos subsequentes, ocasionando em falhas para acesso do atributo do objeto tanto em codificações javascript ou codificações nos eventos de processo e formulário.

Para corrigir basta conferir todos os campos se eles tem a tag de fechamento.

Em meus testes, outro campo que foi fator para ocasionar inconsistências no carregamento do pai x filho foi o uso de aspas simples no atributo name do campo html.

Ao utilizar aspas simples no HTML gerou um erro ao carregar os dados no formulário, ao alterar para aspas duplas deu certo.

Não consegui localizar o fator, portanto não sei dizer se é um erro do meu arquivo HTML ou se é da plataforma, de todo caso vale a análise.

<input type="text" name="campo1" class="form-control"
 readonly="readonly" >

<input type="text" name="campo1" class="form-control"
 readonly="readonly" >

<textarea name='campo3'></textarea>

antes
<input name='campo' >

depois
<input name="campo" />

Palavras Chave

O campo fluig não carrega as telas do formulário

Os itens do pai x filho não carregam os dados do item

Consultar id do formulário na tela do ECM ou na tela de Processos por javascript.

Consulta

O objetivo deste documento é auxiliar na manipulação dos elementos da página do fluig para buscar informações do HTML e reforçar o estudo de HTML e javascript.

Para obter os dados do formulário que estão associados em um formulário do ECM, ou em um formulário da tela de processos basta usar o código abaixo.

O teste pode ser realizado copiando o código abaixo e na barra do navegador escrever javascript: e em seguida colar o código, ou colando o código no console do navegador.

Obs: o processo não pode estar na atividade início, no ged o formulário deve estar aberto.

var dados="";
 ecm = 'ecm-documentview-docframe';
 wcm = 'workflowView-cardViewer';
 el = (e)=>document.getElementById(e);
 (el(ecm)==null ?  el(wcm):  el(ecm)).src
 .split("?")[1]
 .split("&")
 .forEach((k,v)=>{
   dados+= k + "\n" 
 }); 
 alert(dados);
Alterar texto de complemento de atividade de decisão

Ao utilizar uma atividade de decisão, o fluig gera um complemento.

O Complemento gerado é baseado em uma nomenclatura específica da tarefa, que pode ser por exemplo: Tarefa automática: Decisão tomada conforme condições 1 Atividade Detino: Aprovação do Diretor.

A numeração da condição vai depender de qual foi o fluxo escolhido e não fica amigável.

Uma alternativa é utilizar o hAPI.setTaskComments para criar um comentário customizado na tarefa, logo após a execução da atividade de decisão.

Veja no exemplo abaixo, temos o seguinte fluxo:

fluxo – software: eclipse / fluig

Neste exemplo vemos uma atividade de decisão que direciona o fluxo para duas possíveis atividades.

Vamos criar um evento de processo chamado afterTaskComplete ( veja o fluxograma dos eventos de processo ) e em seguida executar o código toda vez que uma tarefa é completada.

No código iremos validar qual é o ID da próxima atividade. Se considerarmos o fluxo de exemplo a atividade “Aprovação do Diretor” tem código 9, enquanto que a atividade “Aprovação do Gestor” tem código 15.

O teste gerou o resultado abaixo:

software : eclipse / fluig
function afterTaskComplete(colleagueId,nextSequenceId,userList){
 
 
 /*
  * 
  * Variáveis principais
  * 
  * */
 
 var num_processo = getValue ("WKNumProces");     
     var usuario = getValue ("WKUser");     
     //var sequenceId = getValue("WKNumState");
     
     
   
     
     //  Atividade Aprovado pela diretoria
 if(nextSequenceId==9){     
 hAPI.setTaskComments(usuario, num_processo, 0, "Aguardando aprovação do diretor."); 
 } 
 
 
 
 //  Atividade Aprovado pela diretoria
 if(nextSequenceId==15){     
 hAPI.setTaskComments(usuario, processId, 0, "Aguardando aprovação do gerente."); 
 }
 
 
 
 }

Referências

https://tdn.totvs.com/display/public/fluig/hAPI

O Fluig não está disparando e-mails.

Um dos recursos mais importantes na plataforma é a gestão da comunicação, seja as notificações, complementos dos processos ou até mesmo os envios de e-mails.

Poderá haver situações em que o seu fluig não esteja enviando e-mails, isso pode ser um erro de configuração no seu sistema, vou deixar abaixo uma lista de possibilidades para você conferir.

Aproveite e participe de nosso grupo de WhatsApp, desta forma você poderá tirar dúvidas e compartilhar experiências em tempo real. Deixe seu e-mail e receba notificações a cada momento que eu postar um conteúdo novo.

Configurações principais.

Os primeiros passos é conferir as configurações principais. Veja dentro do seu painel do WCMADMIN se as opções estão ativas.

Para acessar o WCMADMIN ( Painel de configurações da plataforma) é preciso entrar pelo link: www.meufluig.com/wcmadmin e entrar com o usuário wcmadmin e a senha informada no momento da instalação da plataforma.

O caminho pode mudar, de acordo com sua versão, mas nas versões mais atualizadas são:

  • WCMADMIN > Configurações do Sistema > Parâmetros da Plataforma > Configurações de E-mail.
  • WCMADMIN > Empresas > Email > Habilitar Envio de E-mail.

Durante a configuração é importante realizar os devidos testes. É preciso ter certeza que você inseriu o usuário e senha corretamente, para isso conecte em seu provedor de e-mail e busque no suporte técnico quais as configurações, para que você efetue o registro com seu e-mail corporativo.

Configurações de SMTP do Gmail.

Este é um exemplo das configurações para envio de e-mail utilizando o gmail. Veja mais neste link.

No geral, as configurações são bem parecidas, mas é bem importante estar atento, pois qualquer diferença das configurações do seu provedor com o que for informado no fluig poderá acarretar em um problema e seu fluig deixar de enviar e-mail.

Uma observação é que alguns provedores de e-mail ( O Gmail se inclui nesta lista ) possuem configurações específicas que devem ser realizadas antes de utilizar este recurso. Você precisa verificar dentro do seu provedor de e-mail como ativar o envio de SMTP da sua caixa de e-mail.

No caso do GMAIL em específico eu recomendo a leitura destes dois artigos: Desabilitar apps menos seguros e ler mensagens em outros clientes de e-mail utilizando o pop. Este segundo artigo é somente para entendimento.

Servidor de envio de e-mails (SMTP)smtp.gmail.com
Requer SSL: Sim
Requer TLS: Sim (se disponível)
Requer autenticação: Sim
Porta para SSL: 465
Porta para TLS/STARTTLS: 587
Nome completo ou Nome de exibiçãoSeu nome
Nome da conta, Nome do usuário ou Endereço de e-mailSeu endereço de e-mail completo
SenhaSua senha do Gmail
Tabela de configurações SMTP disponível em suporte.google.com

Verifique o porquê o seu fluig não dispara os e-mails através dos logs do fluig.

Mesmo se após toda configuração do fluig e sua plataforma não dispara e-mails, é recomendado que analise os logs, pois lá será a melhor fonte de informação das parametrizações incompletas.

Os erros gerados na plataforma são registrados no arquivos de log. Recomendo a leitura do post abaixo.

Um exemplo de erro é quando a senha está inválida, o fluig consegue autenticar no provedor de e-mail, mas tem o retorno de senha inválido. Neste caso o erro fica explicito no arquivo de log.

como ler logs no fluig

Conclusão.

Neste post você viu alguns possíveis problemas para envios de e-mail no fluig. Caso tenha dúvidas participe de nossa comunidade no WhatsApp, ou deixe nos comentários desta página.

Kit Fluig – Um guia para desenvolvimento na plataforma fluig.

Seja bem vindo à página Kit Fluig, nesta página irei documentar os principais assuntos para te auxiliar no desenvolvimento de soluções na plataforma fluig, direcionando a páginas deste blog, ou da comunidade como uma forma alternativa à documentação oficial.

Introdução

Este é um guia, que será atualizado constantemente com as principais documentações / recursos para a plataforma fluig.

Veja aqui uma sugestão de boas práticas, para aplicar na nomenclatura dos processos, formulários e datasets.

Repositórios GIT da Comunidade

Verifique nesta seção os repositórios da comunidade.

https://github.com/willianmascimiano/fluig

https://github.com/tiagotsukahara/fluig-docsp

Primeiros passos

Datasets

Processos

WCM e Widgets

Formulários

Como gerenciar equipes em três passos.

A rotatividade de equipes pode ser um problema e um dos principais efeitos da rotatividade é o tempo que será necessário dedicar a um novo funcionário.

Treinar novos funcionários pode levar tempo, e como já diz o ditado tempo é dinheiro. Mas destaco este como sendo o primeiro tema, pois considero o mais importante. Dedicar tempo ao treinamento vai um pouco na contramão do ditado, pois o tempo gasto no treinamento irá gerar mais retorno, podendo de qualidade de serviço e gerar menos erros.

1 – Treinamento

O treinamento de uma equipe precisa ser constante, deve tornar-se um hábito.

O principal fator de sucesso para quem quer alcançar o sucesso é buscar o conhecimento.

Independente de sua escolha, se for especialidade técnica, gestão ou empreendedor, você precisa estudar.

Disseminar o conhecimento pode ser a melhor forma de atingir uma gestão bem sucedida. Este hábito te aperfeiçoa, pois a melhor forma de aprender é ensinar.

Dar autonomia ao funcionário e propor um horário de estudo diário, durante o expediente, pode ser uma boa saída, mesmo em casos que o operacional do funcionário consome muito tempo.

Quando estamos concentrados no dia a dia deixamos de perceber que atuamos no piloto automático.

Dar um espaço e oportunidade para seu funcionário se dedicar a um estudo pode ser um benefício, pois ele pode atingir uma mentalidade suficiente para questionar seu trabalho e buscar melhorias.

2 – Processos bem definidos.

Os processo são rotinas operacionais, são como uma receita de bolo.

Você precisa olhar para seu ambiente operacional e buscar entender os processo que estão à sua volta.

Suas rotinas operacionais podem ser desenhadas e documentadas, de forma que à partir do seu correto entendimento seja possível aplicar um olhar crítico.

Observar e revisar os processos podem fazer que você otimize suas rotinas, outro benefício é documentar seus processos.

3 – Documentar os procedimentos operacionais.

Esta é uma etapa extremamente trabalhosa.

Documentar os procedimentos operacionais de sua área é um desafio enorme, principalmente manter estes documentos atualizados.

O benefício, com certeza supera qualquer desvantagem. Ao documentar os processos e rotinas operacionais, você consegue criar padrões para a equipe desenvolver um trabalho transparente.

Um dos frameworks principais, que eu gosto, é o Scrum.

O Scrum pauta pela transparência. Obviamente que a transparência vai existir na medida correta para cada pessoa / responsabilidade.

Mas o fato de todos conversarem sobre suas atividades, torna o processo de unificar o conhecimento um pouco mais fácil

Conclusão

Buscar aprender sobre processos e entender a importância de documentar as rotinas de cada integrante da sua equipe pode esclarecer, no papel, quais responsabilidades e habilidades você espera em cada funcionário.

O comprometimento também é um fator que precisa ser analisado em cada um, pois a falta de interesse do funcionário em seguir as regras estabelecidas por você pode de certa forma atrapalhar o resultado da sua gestão.

Otimizar e criar padrões de processos, além de definir as janelas de horas do dia para cada atividade da semana, pode ajudá-lo a guiar sua equipe, pois fica claro o que você espera, e serve de um lembrete para você, do que cada funcionário deve fazer naquele horário.