Montar Email com Dataset no beforeTakSave para Envio

Prezados, tudo bem?

Estou criando um processo em que vou tentar automatizar o envio de alguns relatórios que são tirados do banco de dados para ser enviado via FLUIG.

Vou utilizar um DATASET que contenha a VIEW ou SELECT do relatório.

Mediante isso tenho alguns problemas e já consegui desenvolver algumas partes do projeto.

1) No FLUIG consigo chamar o DATASET e mostrar na tela com todas as informações;

2) No beforeTaskSave.js consegui montar o HTML e a função para enviar por e-mail pelo menos o cabeçalho da tabela.

3) Agora vem o problema: Não estou conseguindo gerar o DATASET dentro do beforeTaskSave.js, vi alguns vídeos que poderiam ajudar porem nenhum deles usa DATASET e sim uma lista gerada por IDs. Vou copiar abaixo o código que tentei utilizar para gerar o DATASET:


function montarItensSolicitacao() {

    var html = "";
    html += "<thead class='table table-striped'>";
    html += "<tr>";
    html += "   <th style='flex: 1 0 0%;'>INSTANCIA</th>";
    html += "   <th style='flex: 1 0 0%;'>SAFRA</th>";
    html += "   <th style='flex: 1 0 0%;'>FAZENDA</th>";
    html += "   <th style='flex: 1 0 0%;'>FORNECEDOR</th>";
    html += "   <th style='flex: 1 0 0%;'>TONELADAS</th>";
    html += "</tr>";
    html += "</thead>";
    html += "<tbody>";

    var processo = getValue("WKNumProces");
    var campos = hAPI.getCardData(processo);

    var contador = campos.keySet().iterator();

    while (contador.hasNext()) {

        var id = contador.next();
        log.info("##** LOG DO ID ");
        log.info(id);

        if (id.match(/NO_LIBERACAO/)) {

            var campo = campos.get(id);

            var id = id.split("___")[1];

            var liberacao = campos.get("NO_LIBERACAO");
            var instancia = campos.get("INSTANCIA");
            var movimento = campos.get("DE_MOVIMENTO");
            var upnivel = campos.get("CD_UPNIVEL1");
            var fornec = campos.get("CD_FORNEC");
            var liquido = campos.get("QT_LIQUIDO");

            log.info("##** LOG DO PROCESSO ");
            log.info(liberacao);

            html += "<tr>";
            html += "   <td>" + liberacao + "</td>";
            html += "   <td>" + instancia + "</td>";
            html += "   <td>" + movimento + "</td>";
            html += "   <td>" + upnivel + "</td>";
            html += "   <td>" + fornec + "</td>";
            html += "   <td>" + liquido + "</td>";
            html += "</tr>";

            log.info("##** CRIADO EMAIL ");
            log.info(html);

        } //FIM IF
    } // FIM WHILE

    html += "</tbody></table>";

    return html;
}

Abaixo vou anexar a função que estou utilizando no HTML mesmo para gerar o DATASET dentro do processo:


<script type="text/javascript">
    function showNewDatasetFull() {
        var div = document.getElementById("datasetDiv");

        //Busca o dataset
        try {
            var dataset = DatasetFactory.getDataset("TESTE_TALHAO");
            div.innerHTML = showDataset(dataset);
        } catch (erro) {
            div.innerHTML = erro;
        }
    }

    function showDataset(dataset) {
        var tabela = "<table class='table table-striped'>";

        //Monta o cabeçalho
        tabela += "<thead class='table-dark'><tr>";
        for (var i = 0; i < dataset.columns.length; i++) {
            tabela += "<th>" + dataset.columns[i] + "</th>";
        }
        tabela += "</tr></thead>";

        //Monta os registros   
        for (var x = 0; x < dataset.values.length; x++) {
            tabela += "<tr>";
            var row = dataset.values[x];
            for (var y = 0; y < dataset.columns.length; y++) {
                tabela += "<td>" + row[dataset.columns[y]] + "</td>";
            }
            tabela += "</tr>";
        }

        tabela += "</table>";
        return tabela;
    }
</script>

Tentei utilizar a mesma função tanto no HTML quanto no beforeTaskSave.js porem como ele possui elementos de FRONT ele não gera no BACKEND e retorna um erro no LOG do servidor.

Caso alguém tiver alguma função que possa estar me ajudando ou me ajudar melhorando as minhas ficarei bem feliz.

Obrigado pela ajuda.

Att.

David Jr.

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

A resposta do nosso amigo Evando Borba foi crucial para eu conseguir finalizar o processo de envio e conseguir montar o e-mail direitinho dentro da função beforeTaskSaved.js.

Vou explicar o código com o try catch que ele disse e deixar a função toda anexa para as futuras gerações poderem solucionar seus problemas também.

Depois de criado o modelo de email como mostra o vídeo: https://www.youtube.com/watch?v=Epw24RsWhYM

Ele foi crucial para me ajudar no desenvolvimento então recomendo muito assistirem o vídeo nos detalhes.

Basicamente minha estrutura foi a mesma que ele criou tanto no HTML do formulário de email quanto nas funções de envio do email.

Algumas coisa claro que foram adaptadas pois minha realidade era diferente da dele eu queria enviar um DATASET.

Primeiro de tudo é feito uma verificação de qual Etapa do Processo irá disparar o e-mail a função beforeTaskSaved possui um atributo nextSequenceId que ja faz isso pra gente então é só você comparar com algum número integer mesmo informando qual processo:


var atv_inicio = 6;
var atv_envio_mail = 2;
var atv_fim = 4;

É feito um IF para verificar e chamar as funções de disparo de e-mail:


if (nextSequenceId == atv_envio_mail) {}

Dentro do if chamamos a função enviaEmail() que basicamente vai montar o e-mail pra gente setar os valores das variáveis que vão estar no modelo de layout do e-mail.

Aqui nos montamos o envio do email por assim dizer:


var notificacao = notifier.notify("000000000", "MD_TALHOES_SUSPENSOS_MAIL", parametros, destinatarios, "text/html");

Aqui temos 5 campos cada um com uma importância que é bem explicada no vídeo, vou pincelar aqui.

000000000 => USUÁRIO QUE SERÁ ENVIADO O EMAIL (OU GRUPO DE USUÁRIOS CASO CRIADO UM ARRAY OU PAPEIS, ETC)

MD_TALHOES_SUSPENSOS_MAIL => MODELO DE TEMPLATE CRIADO DENTRO DO FLUIG

parametros => VARIÁVEIS QUE SERÃO ENVIADAS PELO E-MAIL NO CÓDIGO ABAIXO VEMOS O parametros.put QUE MONTA UM "ARRAY" COM AS INFORMAÇÕES


parametros.put("ITENS_TABELA", tabelaItens); //ENVIA A TABELA PARA O E-MAIL
parametros.put("ONTEM", ontem);

destinatarios => DE ONDE SERÁ BUSCADO OS DESTINATÁRIOS, NESSE CASO DE UMA USERLIST

text/html => AQUI SÓ INFORMAMOS QUE O TIPO DE ENVIO É TEXTO E HTML.

Agora temos a função montarItensSolicitacao() que faz toda a mágica de montar as tabelas e buscar o DATASET.

No código abaixo eu faço o getDatset


var dataset = DatasetFactory.getDataset("TESTE_TALHAO", null, null, null); //BUSCA DE DATASET

Como é feito um laço para mostrar TODAS as linhas da tabela, precisamos contar a quantidade de linhas para dar o stop no laço, eu achei melhor usar esse código abaixo, que recebe a quantidade de linhas do DATASET e da uma limitação.


var count = dataset.rowsCount; //CONTA COLUNAS PARA LAÇO PARA PASSAR PELO DATASET E MONTAR AS TABELAS

Montamos o try catch para obter as informações do DATASET ou saber se fizemos "HDA" e usamos o código dataset.getValue([i], "COLUNA_DATASET") para pegar a informação da coluna e montar no HTML.

Assim colocamos todas colunas da nossa tabela fechamos o FOR e retornamos a tabela criada.

E assim enviar um DATASET por e-mail.

Com o vídeo e o documento anexo vocês podem fazer alguns testes e chegar ao mesmo resultado que eu, lembrando que o CSS das tabelas deve ser feito de forma simples e não usar BOOTSTRAP ou nada parecido, alguns serviços de email não aceitam então o CSS deve ser feito dentro do style na tag:

Ficando atento a isso criamos um e-mail bem bonito e completo com as informações do DATASET.

Qualquer dúvida eu tento ajudar nas mensagens.

Obrigado.

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.