Categorias
TOTVS Fluig

TOTVS FLUIG – Como resolver o erro PKIX path validation failed

Olá, Fluiger!

Atualmente, estou desenvolvendo um projeto Fluig integrado à uma API do SAP, para uma empresa da Colômbia. O primeiro passo para se comunicar com essa API, foi criar um serviço para guardar o Domínio, e depois só invocar esse serviço adicionando o endpoint, e as credenciais no corpo da requisição.

Mas, ao tentar fazer a primeira requisição, neste caso a de LOGIN,

retornou esse erro de segurança do Java “PKIX path validation failed: java.security.cert.CertPathValidatorException”.

Em uma busca rápida no Google, localizamos o motivo desse erro:

O erro acontece porque o servidor Java (JBoss/Wildfly) onde seu Fluig está rodando não confia no certificado SSL/TLS apresentado pela API HTTPS.

Isso geralmente ocorre por dois motivos:

  1. A API está usando um certificado autoassinado (self-signed).
  2. A API está usando um certificado assinado por uma Autoridade Certificadora (CA) interna ou privada, que não está na lista de CAs confiáveis padrão do Java.

Para resolver isso, é necessário “ensinar” o Java do seu Fluig a confiar neste certificado.
Ou seja, precisamos pegar o arquivo do certificado da API e dizer pro Java do Fluig confiar nele.

IMPORTANTE:  As instruções abaixo só são aplicáveis, caso você tenha acesso total ao servidor Fluig da sua empresa (on premise), e se o servidor for Windows. Possa ser que em servidores Linux, as instruções sejam diferentes.

Mas antes de qualquer coisa, precisamos garantir que a variável de ambiente JAVA_HOME esteja configurada corretamente:

  • No servidor do Fluig, acesse Painel de Controle > Sistema e Segurança > Sistema > Configurações avançadas do sistema
  • Em Propriedades do Sistema > aba Avançado > Variáveis de Ambiente
  • Em variáveis do sistema procure pela variável JAVA_HOME e edite a mesma. Deve ser algo como: C:\fluig\jdk-64. Caso não exista, é só criá-la.

Após cadastrado a variável JAVA_HOME, encontre a variável path. Dentro dela, deve existir a variável %JAVA_HOME%\bin Caso não exista, é só adicioná-la.

Agora sim, podemos seguir com os passos do Certificado da API:

  • Acesse a URL da API HTTPS no seu navegador.
  • Clique no cadeado ao lado da URL.
  • Vá em “A conexão é segura” -> “O certificado é válido”.
  • Vá na aba Detalhes.
  • Clique em Exportar (ou “Copiar para Arquivo…”).
  • Salve o certificado. Escolha o formato “Base-64 encoded X.509 (.CER)”.

    Eu salvei na pasta de downloads

Em seguida, precisamos localizar o arquivo CACERTS que fica na pasta de instalação do Java (JDK/JRE) que o meu Fluig (JBoss/Wildfly) está usando. No meu caso, é C:\fluig\jdk-64\lib\security\cacerts. Salve esse caminho.

Agora, abra o Prompt de Comando (CMD) do seu Windows, navegue até a pasta BIN que fica na pasta de instalação do Java (JDK/JRE) que o meu Fluig (JBoss/Wildfly) está usando. Em seguida, digite o comando a seguir, substituindo api_sap pelo nome que você atribuiu ao seu arquivo de certificado, em seguida o caminho que você o salvou, e em seguida o caminho completo até a pasta CACERTS

keytool -import -alias “api_sap” -file “C:\Users\Administrator\Downloads\api_sap.crt” -keystore “C:\fluig\jdk-64\lib\security\cacerts”

Ao pressionar a tecla ENTER, o keytool pedirá a senha da keystore cacerts. A senha padrão de fábrica do Java é changeit
O keytool perguntará se você confia no certificado. Digite yes e pressione a tecla ENTER.
Se tudo der certo, será exibida uma mensagem que o certificado foi adicionado com sucesso à keystore.

Por último, será necessário reiniciar os serviços do Fluig.

E após a reinicialização, a API poderá ser acessada com sucesso!

E ai!? Você gostou do conteúdo de Fluig de hoje? Deixe o seu comentário!
Forte abraço!!!

Fluig é uma marca registrada da Totvs S.A.
Fontes que me ajudaram a chegar na solução deste problema:

Categorias
TOTVS Fluig

TOTVS FLUIG – Exportar Dados de uma Widget para uma Planilha Excel

Olá, Fluiger!

No post de hoje, te ajudarei a criar uma função para exportar dados de uma widget, para uma planilha excel (Isso também serve para dados que estão em um formulário).

O primeiro passo, é criar uma widget no Eclipse, acessar o arquivo view.ftl, substituir o código existente por este trecho a seguir, e salvar.
Podemos observar os principais itens desse arquivo:
– Linha 7: Título da nossa tabela.
– Linha 11: Nossa tabela com 3 colunas.
– Linha 27: O botão que acionaremos sempre que quisermos exportar os dados da nossa widget.

<div id="MyWidget_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide" data-params="MyWidget.instance()">
    
    <div class="container" style="width: 100%;">

        <div class="panel panel-primary">
            <div class="panel-heading" style="font-weight: bolder;">
                PREVISÃO DO TEMPO - CAMPINAS/SP
            </div>
            <div class="panel-body">
                <div class="row">
                    <div class="table-responsive">
                        <table class="table table-bordered table-hover" id="tbPrevisoes">
                            <thead>
                                <tr>
                                    <th>DATA</th>
                                    <th>TEMPERATURA MINIMA</th>
                                    <th>TEMPERATURA MAXIMA</th>
                                </tr>
                            </thead>
                            <tbody>
                            </tbody>
                        </table>
                    </div>
                </div>
                <div class="row">
                    <div class="form-group">
                        <button class="btn btn-default" data-exportar-dados>Exportar</button>
                    </div>
                </div>
            </div>
        </div>
        
    </div>
    
</div>

O segundo passo, é acessar o arquivo javascript, criado na pasta SRC>>MAIN>>WEBAPP>>RESOURCES>>JS. Agora, substitua todo o código existente por este trecho a seguir, e salve o arquivo.
Podemos observar os principais itens desse arquivo:

  • Linha 3: Nossa fonte de dados, um array de objetos, para popular nossa tabela, e também alimentar a Planilha Excel que exportaremos. (Neste exemplo, a váriavel previsões possui dados fixos, mas poderia também receber dados de um dataset, ou de uma API externa).
  • Linha 36: Função que percorre todos os objetos do nosso array, e os insere nas linhas da tabela.
  • Linha 43: Binding para escutar o clique no botão Exportar, e chamar a função de exportação.
  • Linha 50: Definição da função gerarPlanilha().
  • Linha 56: Definição da variável csv, e a primeira atribuição de valor, com os nomes das colunas conforme desejamos na planilha, separados por ponto e vírgula, e uma quebra de linha no final.
  • Linha 58: Função que percorre todos os objetos do nosso array, e os concatena na variável csv, caso sejam verdadeiros, senão, é adicionado um “–“. Novamente cada valor de cada coluna inserida é separado por ponto e vírgula, seguido de uma quebra de linha “/n”, ao final de cada iteração do FOR.
  • Linha 85: Caso o array tenha registros
    • Definimos o tipo do arquivo de exportação, em hiddenElement.href
    • Definimos o nome do arquivo final, em hiddenElement.download
  • Linha 105: Executamos a função gerarPlanilha(), e o navegador iniciará o download do nosso arquivo de exportação.
var MyWidget = SuperWidget.extend({
    //variáveis da widget
    previsoes: [
        {
            'data': '13/05/2024',
            'min': '18',
            'max': '33'
        },
        {
            'data': '14/05/2024',
            'min': '18',
            'max': '29'
        },
        {
            'data': '15/05/2024',
            'min': '16',
            'max': '27'
        },
        {
            'data': '16/05/2024',
            'min': '15',
            'max': '30'
        },
        {
            'data': '17/05/2024',
            'min': '20',
            'max': '32'
        },
    ],

    //método iniciado quando a widget é carregada
    init: function() {

        for(i in this.previsoes){

            $('#tbPrevisoes').append('<tr><td>'+ this.previsoes[i].data +'</td><td>'+ this.previsoes[i].min +'</td><td>'+this.previsoes[i].max +'</td></tr>');
        }
    },
  
    //BIND de eventos
    bindings: {
        local: {
            'exportar-dados': ['click_exportarDados']
        },
        global: {}
    },
 
    exportarDados: function () {

        var gerarPlanilha = function () {

            // encode
            var universalBOM = "\uFEFF";

            // cabeçalh
            var csv = "DATA;TEMPERATURA MINIMA;TEMPERATURA MAXIMA;\n";

            for (j in this.MyWidget.previsoes) {
                var prev = this.MyWidget.previsoes[j]

                if (!!prev.data) {
                    csv += `${prev.data};`
                } else {
                    csv += "--;"

                }
                if (!!prev.min) {
                    csv += `${prev.min};`
                } else {
                    csv += "--;"

                }
                if (!!prev.max) {
                    csv += `${prev.max};`
                } else {
                    csv += "--;"

                }

                csv += "\n"

                console.log("CSV FINAL: " + csv)
            }

            if (this.MyWidget.previsoes.length > 0) {

                var hiddenElement = document.createElement("a");

                hiddenElement.href = "data:text/csv; charset=ISO-8859-1," + encodeURIComponent(universalBOM + csv)
                hiddenElement.target = "_blank";
                hiddenElement.download = "previsoes.csv";
                hiddenElement.click();
                csv = "";

            } else {

                FLUIGC.message.alert({
                    message: "Não foi possível baixar o relatório, não há registros.",
                    title: "Mensagem",
                    label: "OK",
                });

            }
        };
        gerarPlanilha();

    },

});

Após executar os passos acima, exporte a widget para o servidor, anexe-a em uma página, e acesse-a.

Esta é a nossa widget após o seu carregamento:

Ao clicar no botão EXPORTAR, escolha o local de salvamento.

E visualize o resultado da planilha com os dados da nossa widget!

Caso queira acessar os arquivos dos códigos utilizados nesse tutorial, clique neste link: https://github.com/jorgeMaicon/fluig-exportar-dados-widget-para-planilha .

Esse tutorial te ajudou? Então, deixe um comentário ou sugestão!
Forte abraço!

Fluig é uma marca registrada da Totvs S.A.

Documentação Oficial TOTVS Fluig: https://tdn.totvs.com/display/public/fluig/TOTVS+FLUIG

Categorias
TOTVS Fluig

TOTVS FLUIG – Como enviar emails personalizados em eventos de processo

No post de hoje, trago uma solução bem simples para envio de emails em eventos de workflow.

Explicarei cada trecho do código ao longo do post, e no final, disponibilizarei os arquivos javascript, e html, para vocês baixarem.

*Lembrando que para os scripts abaixo, funcionem corretamente, as configurações de email devem estar ajustadas e testadas no WCMADMIN.

Vamos iniciar pelo script de envio, declarando algumas variáveis com informações provenientes dos campos do formulário utilizado no processo.

var idFluig = getValue("WKNumProces") + '';
var emails = hAPI.getCardValue('emails');
var nome_solicitante = hAPI.getCardValue('solicitante');
var nome_gerente = hAPI.getCardValue('nomeGerente') ;
var nome_supervisor = hAPI.getCardValue('nomeSupervisor');
var valor_total = hAPI.getCardValue('total');

Em seguida, crio uma lista java, chamada PARAMETROS.

var parametros = new java.util.HashMap();

Nessa lista PARAMETROS, insiro as informações que eu preciso passar para o template de email, utilizando o padrão (CHAVE, VALOR)

parametros.put("NOME_USUARIO", nome_solicitante); parametros.put("NOME_SOLICITANTE", nome_solicitante);
parametros.put("NOME_GERENTE", nome_gerente); parametros.put("NOME_SUPERVISOR", nome_supervisor);
parametros.put("VALOR_TOTAL", valor_total);

Essa chave SUBJECT, em específico, é a responsável pelo assunto do email.
Nesse exemplo, estou informando o pagamento de uma solicitação, e concatenando algumas variáveis.

parametros.put("subject", "Pagamento Efetuado para a solicitação (" + idfluig + ") / colaborador (" + nome_solicitante + ")");

Agora, vamos aos destinatários. Para isso, eu crio um array java, chamado DESTINATARIOS.

var destinatarios = new java.util.ArrayList();

Utilizo o método SPLIT para dividir os emails inseridos no campo do formulário separados por “;”.

var emails = emails.split(';')

Rodo um FOR a partir da quantidade de emails detectados na variável EMAILS.

for (var i = 0; i < emails.length; i++) {
  destinatarios.add(emails[i]);
}

Pra finalizar o script e enviar o email, utilizamos a função NOTIFY, alimentando os 5 parâmetros, com as seguintes informações:

Parâmetro 1: Matricula Fluig do usuário remetente deste email.
Recomendamos a criação de um usuário especialmente para utilização como remetente, e que no cadastro dele, seja inserido o mesmo endereço de email da conta cadastrada para envios no WCMADMIN, pois, alguns servidores de email, como o OUTLOOK, não aceitam que uma conta envie mensagens utilizando um endereço de remetente diferente do endereço dela.

Parâmetro 2: Código do TEMPLATE DE EMAIL cadastrado no Painel de Controle do Fluig. Ainda nesse post, exibo um template exemplo.

Parâmetro 3: A variável PARAMETROS, com as informações que serão utilizadas no Template de Email.

Parâmetro 4: A variável DESTINATÁRIOS com a lista de endereços que receberão o email.

Parâmetro 5: Formato do email enviado.

notifier.notify("fluig_email", "tpl_confirmacao_pgto", parametros, destinatarios, "text/html");

Agora, vamos ao Template de Email:

Lembram daquelas informações que adicionamos a lista java PARAMETROS para posteriormente serem exibidas no template de email? Aqui estão elas, referenciadas entre ${} no arquivo html. Esse é um exemplo básico, mas vocês podem passar quantas informações precisarem do script para o template.

<table cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td style="padding: 25px;">
                <h3 class="title">
                    Pagamento Realizado com sucesso!
                </h3>
                <p class="description">
                    O pagamento de ${VALOR_TOTAL} referente as despesas da viagem foi efetuado!
                </р>
                <div class="beneficiado">
                    <b>Beneficiado: </b> ${NOME_SOLICITANTE}
                </div>
                <div class="aprovadores">
                    <p>
                        <b>Supervisor Aprovador:</b> ${NOME_SUPERVISOR}
                    </р>
                    <р>
                        <b>Gerente Aprovador: </b> ${ NOME_GERENTE}
                    </р>
                </div>
            </td>
        </tr>
    </tbody>
</table>

O destinatário receberá o email parecido com esse, com as informações preenchidas no lugar das variáveis entre ${}:

Agora, mãos a obra! Clique no link abaixo, e faça o download dos arquivos que exibi ao longo desse post.
https://github.com/jorgeMaicon/fluig-script-email-personalizado

Caso este tutorial tenha lhe ajudado, deixe um comentário abaixo. Adorarei saber!

Fluig é uma marca registrada da Totvs S.A.

Documentação Oficial TOTVS Fluig: https://tdn.totvs.com/display/public/fluig/TOTVS+FLUIG