jonatasrs / sei

SEI++: Adiciona novas funcionalidades ao Sistema Eletrônico de Informações - SEI
https://jonatasrs.github.io/sei/
GNU General Public License v3.0
71 stars 59 forks source link

Contagem de dias a partir da data de recebimento no setor #126

Open vitorma opened 4 years ago

vitorma commented 4 years ago

olá,

Uma feature legal para extensão seria a possibilidade de contar o número de dias que um processo está no setor. Já temos a possibilidade de contar utilizando um marcador, mas dependendo do número e da frequência de chegada de processos é bem trabalhoso marcar todos. Uma possibilidade para contornar o problema seria pegar a data de recebimento do processo que está na tramitação para fazer a contagem.

vitorma commented 4 years ago

Estou estudando como implementar isso, tenho zero experiência com front, mas seguem minhas descobertas:

var setorUsuario = document.querySelector("#selInfraUnidades > option").label;
var table = ifrVisualizacao.document.querySelector("#tblHistorico");

for (var i = 0; i < table.rows.length; i++) {
    var setorAndamento = table.rows[i].cells[1];
    var descricaoAndamento = table.rows[i].cells[3];
    var dataDeRecebimento;

    if (setorAndamento.innerText == setorUsuario && descricaoAndamento.innerText.startsWith('Processo recebido na unidade')) {

        setorAndamento.innerText = '##' + setorAndamento.innerText + '##'; // marca andamento utilizado

        dataDeRecebimento = table.rows[i].cells[0].innerText.split(" ")[0];

        break;
    }
}

Estou brincando só no console do Chrome.

O código acima funciona se a página de andamento do processo tiver aberta, a data desejada aparece no console.

Como pegar o histórico de tramitação sem precisar abrir o processo?

vitorma commented 4 years ago

Consegui pegar as datas com o código abaixo, usei a seguinte lógica: Pego a tabela de processos, pego os links de cada processo, faço um request para pegar a página do processo, pego o link do frame da árvore de documentos (a barra lateral esquerda da visão do processo), pego link de consultar andamento, faço um request para pegar o frame do histórico de andamento, pego a tabela, faço um filtro pelo último andamento com o nome "Recebido" e pego a data correspondente.

A lógica funciona, mas tem um grande problema, são 300 requests para fazer isso. Mais ou menos 40 segundos para retornar as datas, fica inviável fazer dessa forma.

Se alguém tiver outra forma de fazer isso, por favor entre em contato.

Segue o código, não me preocupei com beleza nem legibilidade, pois estava só querendo fazer funcionar. Basta abrir a página de controle de processos e colar o código no console, depois de uns 40 segundos, você deve ver as datas no log.

var parser = new DOMParser();
var tabelaRecebidos = document.getElementById('tblProcessosRecebidos');
for (var i = 2; i < tabelaRecebidos.rows.length; i++) {
    var urlProcesso = tabelaRecebidos.rows[i].cells[2].querySelector("td:nth-child(3) > a")?.href;
    var request = $.ajax(urlProcesso, {
        success: function(result) {
            var doc = parser.parseFromString(result, "text/html")
            var urlArvore = doc.getElementById('ifrArvore').src;
            var request = $.ajax(urlArvore, {
                success: function(result) {
                    var a = result.indexOf('controlador.php?acao=procedimento_consultar_historico&');
                    var b = result.indexOf("'", a);
                    var urlAndamento = window.location.origin + "/sei/" + result.substring(a, b);
                    var request = $.ajax(urlAndamento, {
                        success: function(result) {
                            var setorUsuario = document.querySelector("#selInfraUnidades > option").label;
                            var doc = parser.parseFromString(result, "text/html")
                            var tabelaAndamento = doc.getElementById('tblHistorico');
                            for (var i = 1; i < tabelaAndamento.rows.length; i++) {
                                var setorAndamento = tabelaAndamento.rows[i].cells[1];
                                var descricaoAndamento = tabelaAndamento.rows[i].cells[3];
                                var dataDeRecebimento;

                                if (setorAndamento.innerText == setorUsuario 
                                    && descricaoAndamento.innerText.startsWith('Processo recebido na unidade')) {
                                    dataDeRecebimento = tabelaAndamento.rows[i].cells[0].innerText.split(" ")[0];
                                    console.log(dataDeRecebimento);
                                    break;
                                }
                            }

                        }
                    });
                }
            });
        }
    });
}