EvaldoMaciel

Rateio

Dec 17th, 2019
158
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* Variáveis globais */
  2. var novoObjeto = []; // Armazena dados do XML tratados
  3. var novoObjetoCorrigido = []; // Armazena dados do XML tratados e com correção de chapa
  4. var depurarObjeto = []; // Armazena dados puros do XML
  5. var contadorDeLinhas = 0; // Armazena a quantidade de linhas do XML
  6. var variavelGlobal; // Para tratamento do arquivo
  7. var retornoFuncinarios = new Array(0); // Retorna os dados do funcionários encontrados no RM
  8. var retornoFuncinariosRM = new Array(0); // Retorna os dados do funcionários encontrados no RM
  9. var retornoFuncinariosUA = new Array(0); // Retorna os dados do funcionários encontrados no RM com Centro de Custo
  10. var retornoFuncionariosComErro = new Array(0); // Armazena as chapas não encontradas no RM
  11. var retornoFuncionariosComErroENome = new Array(0); // Armazena as chapas não encontradas no RM e o nome
  12. var listaCentroDeCusto = new Array(0); // Centro de custo
  13. var listaCentroDeCustoDesc = new Array(0); // Centro de custo com descrição
  14. var listaDeChapas;
  15. var novaListaCC = new Array(0);
  16. var retornoDataTableCC = new Array(0);
  17. var totalPorChapa = new Array(0); // Recebera o total geral por chapa
  18. var valorAgrupadosPorFunc = new Array(0); // Recebera os valores agrupados por chapa para calculo
  19. var totalPorChapaV = new Array(0); // Recebera a soma dos valores agrupados por chapa
  20. var somaTotalPorChapa = totalPorChapaV.reduce((totalGeral, total) => totalGeral + total.total, 0); // Apenas para testar a variável anterior  
  21. var somaTotalGeral = 0;
  22. var rateioPorCCSemAgrupar = new Array(0);
  23. var rateioPorCCAgrupado = new Array(0);
  24. var rateioPorCCSomado = new Array(0);
  25. var rateioPorCCSomadoGeral = rateioPorCCSomado.reduce((totalGeral, total) => totalGeral + total.total, 0); // Apenas para validar a variavel anterior  - Se houver erro em alguma das chapas o valor devera ser abaixo do total somando do espelho
  26. var CSVcompletoSemTratamento; // Irá armazera um JSON com os dados do espelho
  27. var objetoTratado; // Irá armazera um JSON com os dados tratados do espelho
  28. var objetoCorrigido; // Irá armazera um JSON com os dados corrigidos do espelho
  29.  
  30.  
  31. /* Funções globais */
  32. var novaChapa = function (chapaAntiga) {
  33.     var novaChapa = ("000000" + chapaAntiga).slice(-6);
  34.     return novaChapa;
  35. }
  36.  
  37. var separar = (itens, maximo) => {
  38.     return itens.reduce((acumulador, item, indice) => {
  39.         var grupo = Math.floor(indice / maximo);
  40.         acumulador[grupo] = [...(acumulador[grupo] || []), item];
  41.         return acumulador;
  42.     }, []);
  43. };
  44.  
  45. function procuraNoArray(chave, conteudoChave, meuArray, campoRetorno) {
  46.     var novoArray = new Array();
  47.     for (var i = 0; i < meuArray.length; i++) {
  48.         if (meuArray[i][chave] === conteudoChave) {
  49.             novoArray.push({
  50.                 encontrou: meuArray[i][chave],
  51.                 retorno: meuArray[i][campoRetorno]
  52.             });
  53.             //return "Encontrou";
  54.         } else {
  55.             // Não faz nada... por enquanto
  56.         }
  57.     }
  58.     novoArray.push({
  59.         encontrou: "FIM",
  60.         retorno: "FIM"
  61.     });
  62.     return novoArray;
  63. }
  64.  
  65. function inicializarAutoComplete(nomeDoCampo) {
  66.     var operacoesAutoComplete = [];
  67.     if (operacoesAutoComplete[nomeDoCampo] !== undefined) {
  68.         operacoesAutoComplete[nomeDoCampo].destroy();
  69.         operacoesAutoComplete[nomeDoCampo] = undefined;
  70.     }
  71.     var campos = ["colleagueName", "colleaguePK.colleagueId"];
  72.     var operacoes = DatasetFactory.getDataset("colleague", campos, null, null).values;
  73.     funcTemp = [];
  74.     for (i = 0; i < operacoes.length; i++) {
  75.         funcTemp.push(operacoes[i]["colleaguePK.colleagueId"] + "-" + operacoes[i]["colleagueName"]);
  76.     }
  77.  
  78.     operacoesAutoComplete[nomeDoCampo] = FLUIGC.autocomplete(nomeDoCampo, {
  79.         source: substringMatcher(funcTemp),
  80.         name: 'funcionarios',
  81.         minLength: 5,
  82.         displayKey: 'description',
  83.         allowDuplicates: false,
  84.         hint: true,
  85.         tagClass: 'tag-gray',
  86.         type: 'autocomplete'
  87.     });
  88. }
  89.  
  90. function substringMatcher(strs) {
  91.     return function findMatches(q, cb) {
  92.         var matches, substrRegex;
  93.         matches = [];
  94.         substrRegex = new RegExp(q, 'i');
  95.         $.each(strs, function (i, str) { if (substrRegex.test(str)) { matches.push({ description: str }); } }); cb(matches);
  96.     };
  97. }
  98.  
  99. function mapeiaAlteracaoDeChapa() {
  100.     listaDeIds = $("[id^='chapaNome']");
  101.     listaDeIds.on("change", function () {
  102.         for (i = 0; i < listaDeIds.length; i++) {
  103.             if (listaDeIds[i].name != null) {
  104.                 var c1 = $("#" + listaDeIds[i].name).selector.replace('#chapaNome', '');
  105.                 var novaChapa1 = $("#chapaNome" + c1).val().split("-")[0];
  106.                 var novoFunc = $("#chapaNome" + c1).val().split("-")[1];
  107.                 if (novoFunc != undefined) {
  108.                     $("#novoFunc" + c1).text("Funcionário correto: " + novoFunc);
  109.                     $("#novoFunc" + c1).text();
  110.  
  111.                     // Atribuí a chapa correta ao novoObjetoCorrigido
  112.                     for (var i = 0; i < novoObjetoCorrigido.length; i++) {
  113.                         if (novoObjetoCorrigido[i].chapa == c1) {
  114.                             novoObjetoCorrigido[i].chapa = novaChapa1;
  115.                         }
  116.                     }
  117.                 }
  118.             }
  119.         }
  120.     });
  121. }
  122.  
  123. function porcentagem(val1) {
  124.     return (val1 / 100);
  125. }
  126.  
  127. function calcPercet(valtotal, valUnit) {
  128.     let previa = (valUnit * 100);
  129.     let resultado = (previa / valtotal);
  130.     let saida = Number(resultado).toFixed(2) + "%";
  131.     return saida;
  132. }
  133.  
  134. function buscaCC(params) {
  135.     for (let i = 0; i < listaCentroDeCustoDesc.length; i++) {
  136.         if (listaCentroDeCustoDesc[i].CODCCUSTO == params /* "020.030.050.002.006.003" teste */) {
  137.             var retorno = listaCentroDeCustoDesc[i].NOME;
  138.         }
  139.     }
  140.     var novoRetorno = retorno == undefined ? "CENTRO DE CUSTO NÃO IDENTIFICADO" : retorno;
  141.     return novoRetorno;
  142. }
  143.  
  144. const msgCarregamento = FLUIGC.loading(window, {
  145.     textMessage: 'Aguarde, processando arquivo...'
  146. });
  147.  
  148. const msgTxt = FLUIGC.loading(window, {
  149.     textMessage: 'Carregando arquivo da operadora'
  150. });
  151.  
  152. const consultaDadosFuncMsg = FLUIGC.loading(window, {
  153.     textMessage: 'Processando dados dos funcionários'
  154. });
  155.  
  156. const dataTableRateioMsg = FLUIGC.loading(window, {
  157.     textMessage: 'Processando rateio'
  158. });
  159.  
  160. const dataTableFalhasDeImportacaoMsg = FLUIGC.loading(window, {
  161.     textMessage: 'Processando falhas de importação de funcionários'
  162. });
  163.  
  164. const mudaChapaMsg = FLUIGC.loading(window, {
  165.     textMessage: 'Criando campos para corrigir falhas de importação'
  166. });
  167.  
  168. function mostraCarregamento(loading, anyFunction, ...anyParam) {
  169.     loading.show();
  170.     setTimeout(function () {
  171.         anyFunction(...anyParam);
  172.         loading.hide();
  173.     }, 300);
  174. }
  175.  
  176. function contaItensDeUmArray(contarEsse) {
  177.     array_elements = contarEsse;
  178.     array_elements.sort();
  179.     retorno = new Array();
  180.     var current = null;
  181.     var cnt = 0;
  182.     for (var i = 0; i < array_elements.length; i++) {
  183.         if (array_elements[i] != current) {
  184.             if (cnt > 0) {
  185.                 retorno.push({ "item": current, "contador": cnt });
  186.             }
  187.             current = array_elements[i];
  188.             cnt = 1;
  189.         } else {
  190.             cnt++;
  191.         }
  192.     }
  193.     if (cnt > 0) {
  194.         retorno.push({ "item": current, "contador": cnt });
  195.     }
  196.     return retorno;
  197. }
  198.  
  199. function removeRepetidosArray(arrayBusca, elemento) {
  200.     var novoArray = new Array(0);
  201.     verificaExistencia = function (arrayParaLimpar, itemBusca) {
  202.         var chaves;
  203.         chaves = arrayParaLimpar == undefined ? ['vazio', 'algo'] : arrayParaLimpar;
  204.         var item = itemBusca;
  205.         if (chaves.indexOf(item) > -1) {
  206.             //console.log("Encontrou");
  207.             var retornoVE = true;
  208.         } else {
  209.             //console.log("Não encontrou");
  210.             var retornoVE = false;
  211.         }
  212.         return retornoVE;
  213.     }
  214.  
  215.  
  216.     for (var cont = 0; cont < arrayBusca.length; cont++) {
  217.         var processando = arrayBusca[cont][elemento] == null ? '999999999' : arrayBusca[cont][elemento];
  218.         if (verificaExistencia(novoArray, processando)) {
  219.             // Se encontrar, não faz nada
  220.         } else {
  221.             // Se não encontrar, adiciona ao array
  222.             novoArray.push(processando);
  223.             //console.log(processando);
  224.         }
  225.     }
  226.     return novoArray;
  227. }
  228.  
  229. /* *****************************************
  230. Trabalhando o arquivo TXT */
  231. manipulaArquiv = function () {
  232.     this.primeira = "primeira";
  233.     variavelGlobal = this;
  234. }
  235.  
  236. manipulaArquiv.prototype.lerArquivo = function (arquivo) {
  237.     //console.log("lerArquivo");
  238.     var reader = new FileReader();
  239.     reader.readAsText(arquivo, 'windows-1252');
  240.     reader.onload = function (event) {
  241.         var csv = event.target.result;
  242.         variavelGlobal.adicionaPrevs(csv);
  243.     };
  244.     return "Chamou a função para ler arquivo";
  245. }
  246.  
  247. manipulaArquiv.prototype.adicionaPrevs = function (data) {
  248.     var aLine = data.split(/\r?\n|\r/);
  249.     aLine.forEach(function (element, index) {
  250.         let cols = element.split(';');
  251.  
  252.         if (cols.length >= 10) {
  253.  
  254.             if (index == 0 && cols.length == 30) {
  255.                 // Não faz nada
  256.                 contadorDeLinhas++;
  257.             }
  258.  
  259.             if (index == 1 && cols.length == 30) {
  260.                 // Não faz nada
  261.                 contadorDeLinhas++;
  262.             }
  263.  
  264.             if (cols.length == 78 && index == 0) {
  265.                 // Não faz nada
  266.                 contadorDeLinhas++;
  267.             }
  268.  
  269.             if (cols.length == 10 && cols[4].trim().toUpperCase() == "CENTRAL NACIONAL UNIMED") {
  270.                 // Não faz nada   cols[4] == "CENTRAL NACIONAL UNIMED"
  271.                 console.log("%c" + "CENTRAL NACIONAL UNIMED", "color: lime;");
  272.                 contadorDeLinhas++;
  273.             }
  274.  
  275.             if (cols[0].trim().toUpperCase() == "H") {
  276.                 // Não faz nada
  277.                 contadorDeLinhas++;
  278.             }
  279.  
  280.             if (cols.length == 19) {
  281.                 // Layout criado
  282.                 variavelGlobal.getObjPrev(cols, "copartUnimedBH");
  283.                 console.log("%c" + "copartUnimedBH", "color: lime;");
  284.                 contadorDeLinhas++;
  285.             }
  286.  
  287.             if (cols.length == 78 && index != 0) {
  288.                 // layout criado
  289.                 variavelGlobal.getObjPrev(cols, "copartCNU");
  290.                 console.log("%c" + "copartCNU", "color: lime;");
  291.                 contadorDeLinhas++;
  292.             }
  293.  
  294.             if (cols.length == 34 || cols.length == 27) {
  295.                 // layout criado
  296.                 variavelGlobal.getObjPrev(cols, "mensalidadeUnimedBH");
  297.                 console.log("%c" + "mensalidadeUnimedBH", "color: lime;");
  298.                 contadorDeLinhas++;
  299.             }
  300.  
  301.             if (cols.length == 30) {
  302.                 if (index == 0 || index == 1) {
  303.                     // Não faz nada  
  304.                 } else {
  305.                     variavelGlobal.getObjPrev(cols, "mensalidadeCNU");
  306.                     console.log("%c" + "mensalidadeCNU", "color: lime;");
  307.                     contadorDeLinhas++;
  308.                 }
  309.             }
  310.  
  311.             if (cols.length == 99) {
  312.                 variavelGlobal.getObjPrev(cols, "genericoGENTE");
  313.                 contadorDeLinhas++;
  314.             }
  315.  
  316.             if (contadorDeLinhas == 0) {
  317.                 FLUIGC.message.alert({
  318.                     message: 'Layout não cadastrado para o arquivo importado ou arquivo com erro',
  319.                     title: 'Atenção',
  320.                     label: 'OK'
  321.                 }, function (el, ev) {
  322.                     console.log("------------------------");
  323.                     console.log("Linha que deu erro: " + index);
  324.                     console.log(cols);
  325.                     console.log(cols.length);
  326.                     console.log("------------------------");
  327.                 });
  328.             }
  329.         }
  330.  
  331.         else {
  332.             //Não faz nada;
  333.         }
  334.     });
  335. }
  336.  
  337. manipulaArquiv.prototype.adicionaPrevsDataset = function (data) {
  338.     //var cs0 = DatasetFactory.createConstraint('FUNCIONAL', '00000000000139115', '00000000000139115', ConstraintType.MUST);
  339.     var cs1 = DatasetFactory.createConstraint('COMPETENCIAPGTO', '12/2019', '12/2019', ConstraintType.MUST);
  340.     var cs2 = DatasetFactory.createConstraint('TIPOCSV', 'MENSALIDADE', 'MENSALIDADE', ConstraintType.MUST);
  341.     var cs3 = DatasetFactory.createConstraint('OPERADORA', 'CNU', 'CNU', ConstraintType.MUST);
  342.     var constrr = new Array(cs1, cs2, cs3);
  343.     var datasetDsFormCSVPlano = DatasetFactory.getDataset('dsFormCSVPlano', null, constrr, null);
  344.    
  345.     var aLine = datasetDsFormCSVPlano.values;
  346.     aLine.forEach(function (element, index) {
  347.         //console.log(element);
  348.         variavelGlobal.getObjPrev(element, "dsFormCSVPlano");
  349.         if (index == (aLine.length - 1)) {
  350.             console.log("Acabou o processamento");
  351.         }
  352.     });
  353. }
  354.  
  355. //variavelGlobal.adicionaPrevsDataset();
  356.  
  357. manipulaArquiv.prototype.getObjPrev = function (colunas, layout) {
  358.     let obj;
  359.  
  360.     depurarObjeto.push(colunas);
  361.  
  362.     console.log(JSON.parse(colunas.CCRATEIO));
  363.  
  364.     if (layout == "dsFormCSVPlano") {
  365.         // Arquivo de coparticipação Unimed BH --- RelCO.txt
  366.         obj = {
  367.             beneficiario: colunas.NOME_ASSOCIADO.trim(),
  368.             beneficiarioId: colunas.NUM_ASSOCIADO.trim(),
  369.             prestador: null,
  370.             prestadorId: null,
  371.             dataAtendimento: null,
  372.             codProcedimento: null,
  373.             qtdProcedimento: null,
  374.             valor: parseFloat(parseFloat(colunas.VL_FATURA.trim()) / 100), //deve ser divido por 100 para obter o valor correto
  375.             titular: colunas.NOME_TITULAR.trim(),
  376.             chapa: novaChapa(colunas.FUNCIONAL.trim()),
  377.             CCRATEIO:  JSON.parse(colunas.CCRATEIO)
  378.         };
  379.     }
  380.  
  381.     if (layout == "copartUnimedBH") {
  382.         // Arquivo de coparticipação Unimed BH --- RelCO.txt
  383.         obj = {
  384.             beneficiario: colunas[3].trim(),
  385.             beneficiarioId: colunas[4].trim(),
  386.             prestador: colunas[5].trim(),
  387.             prestadorId: colunas[6].trim(),
  388.             dataAtendimento: colunas[8].trim(),
  389.             codProcedimento: colunas[12].trim(),
  390.             qtdProcedimento: colunas[13].trim(),
  391.             valor: parseFloat(parseFloat(colunas[16].trim()) / 100), //deve ser divido por 100 para obter o valor correto
  392.             titular: colunas[17].trim(),
  393.             chapa: novaChapa(colunas[18].trim())
  394.         };
  395.     }
  396.  
  397.     if (layout == "mensalidadeUnimedBH") {
  398.         obj = {
  399.             beneficiario: colunas[2].trim(),
  400.             beneficiarioId: colunas[1].trim(),
  401.             prestador: colunas[17].trim(),
  402.             prestadorId: colunas[17].trim(),
  403.             dataAtendimento: null,
  404.             codProcedimento: null,
  405.             qtdProcedimento: null,
  406.             valor: parseFloat(parseFloat(colunas[19] ? colunas[19].trim() : 0) / 100), //deve ser divido por 100 para obter o valor correto
  407.             titular: colunas[2].trim(),
  408.             chapa: novaChapa(colunas[25].trim())
  409.         };
  410.     }
  411.  
  412.     if (layout == "copartCNU") {
  413.         obj = {
  414.             beneficiario: colunas[19].trim(),
  415.             beneficiarioId: colunas[16].trim(),
  416.             prestador: colunas[64].trim(),
  417.             prestadorId: colunas[63].trim(),
  418.             dataAtendimento: colunas[27].trim(),
  419.             codProcedimento: colunas[27] == undefined ? "null" : colunas[30].trim(),
  420.             qtdProcedimento: colunas[37].trim(),
  421.             valor: parseFloat(colunas[42].replace(",", ".") ? colunas[42].replace(",", ".") : 0),
  422.             titular: colunas[17].trim(),
  423.             chapa: novaChapa(colunas[13].trim())
  424.         };
  425.     }
  426.  
  427.  
  428.     if (layout == "mensalidadeCNU") {
  429.         obj = {
  430.             beneficiario: colunas[8].trim(),
  431.             beneficiarioId: colunas[11].trim(),
  432.             prestador: null,
  433.             prestadorId: null,
  434.             dataAtendimento: null,
  435.             codProcedimento: null,
  436.             qtdProcedimento: null,
  437.             valor: Number((colunas[21].trim()).replace(',', '.')).toFixed(2) / 100, //deve ser divido por 100 para obter o valor correto
  438.             titular: colunas[14].trim(),
  439.             chapa: novaChapa(colunas[6].trim())
  440.         };
  441.     }
  442.  
  443.     else {
  444.         //console.log("layout não cadastrado " + new Date());
  445.     }
  446.     variavelGlobal.populaObjeto(obj);
  447. }
  448.  
  449. manipulaArquiv.prototype.populaObjeto = function (obj) {
  450.     novoObjeto.push(obj);
  451. }
  452.  
  453. function validaInput(arquivo) {
  454.     if (arquivo.length == 0) {
  455.         FLUIGC.message.alert({
  456.             message: 'Layout não cadastrado para o arquivo importado',
  457.             title: 'Atenção',
  458.             label: 'OK'
  459.         }, function (el, ev) {
  460.             console.log("Linha que deu erro");
  461.             console.log(ev);
  462.         });
  463.     } else {
  464.         console.log("Arquivo valido");
  465.     }
  466. }
  467.  
  468. // Soma os valores do novoObjeto
  469. manipulaArquiv.prototype.somaValoresNovoObjeto = function (nomeObjeto) {
  470.     // Aqui realiza a soma dos valores da propriedade "valor" dentro do objeto
  471.     var total2 = nomeObjeto.reduce((total, valor) => total + valor.valor, 0);
  472.     // Resultado da soma
  473.     return total2;
  474. }
  475.  
  476. /* *****************************************
  477. Trabalhando com dados dos funcionários */
  478.  
  479. /*  A função cerraga os campos do input de chapas com erro e incializa a função inicializarAutoComplete
  480.     passando o nome do campo que deverá ter atribuido o metodo autocomplete do Fluig  */
  481. manipulaArquiv.prototype.mudaChapa = function () {
  482.     var listaDeIds = $("[id^='chapaNome']");
  483.     for (var ind = 0; ind < listaDeIds.length; ind++) {
  484.         var mudou = listaDeIds[ind];
  485.         var carragaCampo = "#" + $(mudou)[0].id;
  486.         inicializarAutoComplete(carragaCampo);
  487.     }
  488. }
  489.  
  490. /* Verifica se a chapa existe e é cadastrada com colleagueId do Fluig */
  491. manipulaArquiv.prototype.consultaDadosFunc = function (chapa) {
  492.     retornoFuncinarios = []; // Limpar novo objeto sempre que carregar um novo arquivo
  493.     var constraintsUsuario = new Array();
  494.     var chapasAConsultar = new Array();
  495.     for (var iChapa = 0; iChapa < chapa.length; iChapa++) {
  496.         chapasAConsultar.push(novaChapa(chapa[iChapa]));
  497.     }
  498.     //console.log('Chapas a consultar ' + chapasAConsultar);
  499.  
  500.     // monta constraints
  501.     for (var func2 = 0; func2 < chapasAConsultar.length; func2++) {
  502.         var buscar = DatasetFactory.createConstraint('colleaguePK.colleagueId', chapasAConsultar[func2], chapasAConsultar[func2], ConstraintType.SHOULD);
  503.         constraintsUsuario.push(buscar);
  504.     }
  505.     var dataset = DatasetFactory.getDataset('colleague', null, constraintsUsuario, null);
  506.  
  507.     for (var i = 0; i < dataset.values.length; i++) {
  508.         retornoFuncinarios.push(dataset.values[i]);
  509.     }
  510.     return dataset;
  511. }
  512.  
  513. /* Consulta dados do funcionário direto no RM */
  514. manipulaArquiv.prototype.consultaDadosFuncRM = function (chapa) {
  515.     // Não funcionou como deveria, a configuração da consulta no RM só permite a consulta de uma chapa por vez
  516.     retornoFuncinariosRM = new Array(0); // Limpar novo objeto sempre que carregar um novo arquivo
  517.     var constraintsUsuario = new Array();
  518.     var chapasAConsultar = new Array();
  519.     for (var iChapa = 0; iChapa < chapa.length; iChapa++) {
  520.         chapasAConsultar.push(novaChapa(chapa[iChapa]));
  521.     }
  522.     //console.log('Chapas a consultar ' + chapasAConsultar);
  523.     for (var func2 = 0; func2 < chapasAConsultar.length; func2++) {
  524.         var buscar = DatasetFactory.createConstraint('CHAPA', chapasAConsultar[func2], chapasAConsultar[func2], ConstraintType.SHOULD);
  525.         constraintsUsuario = new Array(buscar);
  526.         var dataset = DatasetFactory.getDataset('dsBuscaDadosFuncionarioRM', null, constraintsUsuario, null);
  527.         for (var i = 0; i < dataset.values.length; i++) {
  528.             if (dataset.values[i]["NOME"] != null) {
  529.                 //console.log("Encontrado");
  530.                 retornoFuncinariosRM.push(dataset.values[i]);
  531.             }
  532.             if (dataset.values[i]["CHAPA"] == "Cannot find function has in object ." || dataset.values[i]["CHAPA"] == null || dataset.values[i]["CHAPA"] == undefined) {
  533.                 //console.log("Não encontrado");
  534.                 retornoFuncinariosRM.push({
  535.                     "CHAPA": chapasAConsultar[func2],
  536.                     "NOME": "Desconhecido"
  537.                 });
  538.             }
  539.         }
  540.     }
  541. }
  542.  
  543. /*  Consulta dados do RM retornando o também o centro de custo e a fração de rateio */
  544. manipulaArquiv.prototype.consultaDadosFuncUA = function (chapa) {
  545.     //console.log("==============================")
  546.     console.log("%c" + "Carregando os dados dos funcionários", "color: pink;");
  547.     retornoFuncinariosUA = null;
  548.  
  549.     var chapas = [];
  550.  
  551.     for (let j = 0; j < chapa.length; j++) {
  552.         chapas.push(novaChapa(chapa[j]));
  553.     }
  554.  
  555.     var lista = separar(chapas, 1000);
  556.     var constraintsUsuario = [];
  557.     var saida = [];
  558.  
  559.     for (let i = 0; i < lista.length; i++) {
  560.         var buscar = DatasetFactory.createConstraint('CHAPA_IN', lista[i].join(), null, ConstraintType.SHOULD);
  561.         constraintsUsuario = new Array(buscar);
  562.         var datasetUA = DatasetFactory.getDataset('ds_BuscaFuncionarioComRateio', null, constraintsUsuario, null);
  563.         saida.push(datasetUA.values);
  564.     }
  565.  
  566.     var retorno = saida.flat();
  567.     retornoFuncinariosUA = retorno;
  568.     return retorno;
  569. }
  570.  
  571. /*  Monta o datable com falhas de importação */
  572. manipulaArquiv.prototype.dataTableFalhasDeImportacao = function (nomeObjeto) {
  573.     console.log("%c" + "Montando o datatable com falhas de importação", "color: red;");
  574.     var retornoDataTable = new Array(0);
  575.     var funcionariosBuscar = new Array(0);
  576.     var removerRepetido = new Array(0)
  577.     novoObjetoCorrigido = novoObjeto;
  578.  
  579.     retornoFuncinariosUA;
  580.  
  581.     // Remove os repetidos para encontramos as chapas com erro
  582.     var removerRepetido = new Array(0)
  583.     for (var i = 0; i < nomeObjeto.length; i++) {
  584.         if (removerRepetido.length == 0) {
  585.             removerRepetido.push(nomeObjeto[i]);
  586.         }
  587.         if (removerRepetido.length > 0) {
  588.             for (var j = 0; j < removerRepetido.length; j++) {
  589.                 var buscaChapaNoRepetido = removerRepetido.map(function (e) { return e.chapa; }).indexOf(nomeObjeto[i].chapa);
  590.                 var buscaChapaNoUA = retornoFuncinariosUA.map(function (e) { return e.CHAPA; }).indexOf(nomeObjeto[i].chapa);
  591.  
  592.                 if (buscaChapaNoUA < 0 && buscaChapaNoRepetido < 0) {
  593.                     //console.log("Chapa não encontrada %c" + nomeObjeto[i].chapa, "color: red;");
  594.                     removerRepetido.push({
  595.                         naoEncontrado: "Sim",
  596.                         ...nomeObjeto[i]
  597.                     });
  598.                 }
  599.                 else if (buscaChapaNoRepetido < 0) {
  600.                     var element = removerRepetido[j].titular + " - " + nomeObjeto[i].titular;
  601.                     removerRepetido.push(nomeObjeto[i]);
  602.  
  603.                 }
  604.                 //console.log(i + " - " + j);
  605.             }
  606.         }
  607.  
  608.     }
  609.     //console.log(removerRepetido);
  610.  
  611.     var retornoDataTable = new Array(0);
  612.     for (var iii = 0; iii < removerRepetido.length; iii++) {
  613.         if (removerRepetido[iii].naoEncontrado == "Sim" && removerRepetido[iii].naoEncontrado) {
  614.             retornoDataTable.push(new Array(
  615.                 removerRepetido[iii].chapa,
  616.                 removerRepetido[iii].titular,
  617.                 removerRepetido[iii].valor
  618.             ));
  619.         }
  620.     }
  621.  
  622.     //console.log("%c" + "Chapas com erro", "color: red;");
  623.     //console.log(retornoDataTable);
  624.  
  625.     var tabela = $('#tableFalhasDeImportacao').dataTable();
  626.     tabela.fnDestroy();
  627.     $('#tableFalhasDeImportacao').dataTable({
  628.         data: retornoDataTable,
  629.         "language": {
  630.             "url": "//cdn.datatables.net/plug-ins/1.10.19/i18n/Portuguese-Brasil.json"
  631.         },
  632.         "pageLength": 50,
  633.         columns: [
  634.             {
  635.                 title: "Procurar chapa correta",
  636.                 "class": "novaChapa fs-txt-center col-md-1",
  637.                 "orderable": false,
  638.                 "render": function (data, type, full, meta) {
  639.                     var retornoBC = "<input type=\"text\" class=\"form-control\" id=\"chapaNome" + full[0] + "\" name=\"chapaNome" + full[0] + "\">";
  640.                     return retornoBC;
  641.                 },
  642.             },
  643.             {
  644.                 title: "Nome",
  645.                 "render": function (data, type, full, meta) {
  646.                     var retornoClass = "<span id='nomeFuncionario" + full[0] + "'>" + full[1] + "</span><label for='novoFunc" + full[0] + "' id='novoFunc" + full[0] + "'></label>";
  647.                     return retornoClass;
  648.                 }
  649.             },
  650.             { title: "Valor", "class": "moedaReal" }
  651.         ]
  652.     });
  653. }
  654.  
  655. /*  Remove chapas repetidas para agilizar as consultas */
  656. manipulaArquiv.prototype.removeChapasRepetidas = function (nomeObjeto) {
  657.     var arrayDeChapas = [];
  658.     verificaExistencia = function (array, itemBusca) {
  659.         var chaves;
  660.         chaves = array == undefined ? ['vazio', 'algo'] : array;
  661.         var item = itemBusca;
  662.         if (chaves.indexOf(item) > -1) {
  663.             var retornoVE = true;
  664.         } else {
  665.             var retornoVE = false;
  666.         }
  667.         return retornoVE;
  668.     }
  669.     for (var rCI = 0; rCI < nomeObjeto.length; rCI++) {
  670.         if (verificaExistencia(arrayDeChapas, parseInt(nomeObjeto[rCI]['chapa']))) {
  671.             // Se encontrar, não faz nada
  672.         } else {
  673.             // Se não encontrar, adiciona ao array
  674.             arrayDeChapas.push(parseInt(nomeObjeto[rCI]['chapa']));
  675.         }
  676.     }
  677.     return arrayDeChapas;
  678. }
  679.  
  680. /*  Compara itens de arrys, porém, é necessário ter as chaves login e chapa */
  681. manipulaArquiv.prototype.compararArrays = function (array1, array2) {
  682.     retornoFuncionariosComErro = new Array(0);
  683.     retornoFuncionariosComErroENome = new Array(0);
  684.  
  685.     for (var ai1 = 0; ai1 < array1.length; ai1++) {
  686.         for (var ai2 = 0; ai2 < array2.length; ai2++) {
  687.             var retorno = procuraNoArray('login', array2[ai2]['chapa'], array1);
  688.             //console.log("Chapa consultada: " + array2[ai2]['chapa']);
  689.             var novoRetorno = retorno == undefined ? "Não encontrou nada" : retorno;
  690.             //console.log(retorno);
  691.         }
  692.     }
  693.     return novoRetorno;
  694. }
  695.  
  696. /* *****************************************
  697. * Trabalhando os centro de custo
  698. **/
  699.  
  700. /*  Remove códigos de centro de custo repetidos e atribuí a uma array */
  701. manipulaArquiv.prototype.removeCCRepetidos = function (retornoFunc) {
  702.     console.log("%c" + "Removendo centro de custo repetido", "color: #ffff00;");
  703.     var arrayDeCC = [];
  704.     verificaExistencia = function (array, itemBusca) {
  705.         var chaves;
  706.         chaves = array == undefined ? ['vazio', 'algo'] : array;
  707.         var item = itemBusca;
  708.         if (chaves.indexOf(item) > -1) {
  709.             //console.log("Encontrou");
  710.             var retornoVE = true;
  711.         } else {
  712.             //console.log("Não encontrou");
  713.             var retornoVE = false;
  714.         }
  715.         return retornoVE;
  716.     }
  717.     for (var rCI = 0; rCI < retornoFunc.length; rCI++) {
  718.  
  719.         var centroDeCusto = retornoFunc[rCI]['CODCCUSTO'] == null ? '999999999' : retornoFunc[rCI]['CODCCUSTO'];
  720.  
  721.         if (verificaExistencia(arrayDeCC, centroDeCusto)) {
  722.             // Se encontrar, não faz nada
  723.         } else {
  724.             // Se não encontrar, adiciona ao array
  725.             arrayDeCC.push(centroDeCusto);
  726.             //console.log(centroDeCusto);
  727.         }
  728.     }
  729.     return arrayDeCC;
  730. }
  731.  
  732. /*  Consulta centro de custo a partir do novo array
  733.     O dataset de funcionários já retorna o centro de custo com código e descrição, utilizar para para fazer essa lista.
  734. */
  735. manipulaArquiv.prototype.consultaCentroDeCusto = function (CODCCUSTO) {
  736.     console.log("%c" + "Consultando centro de custo no RM", "color: #bfff00;");
  737.     listaCentroDeCustoDesc = new Array(0);
  738.     var pesquisarCC = separar(CODCCUSTO, 50);
  739.     novaListaCC = new Array(0);
  740.  
  741.     for (let j = 0; j < pesquisarCC.length; j++) {
  742.         let cccs = new Array(0);
  743.         for (let ccc = 0; ccc < pesquisarCC[j].length; ccc++) {
  744.             let c1 = DatasetFactory.createConstraint('CODCCUSTO', pesquisarCC[j][ccc], pesquisarCC[j][ccc], ConstraintType.SHOULD, true);
  745.             cccs.push(c1);
  746.         }
  747.         let datasetDsCentroDeCusto = DatasetFactory.getDataset('dsBuscaCentroCusto', null, cccs, null);
  748.         listaCentroDeCustoDesc.push(datasetDsCentroDeCusto.values);
  749.         novaListaCC.push(datasetDsCentroDeCusto.values);
  750.     }
  751.  
  752.     var saida = novaListaCC;
  753.     return saida;
  754. }
  755.  
  756. /* Cria um array com o número do centro de custo de todos os funcionários */
  757. manipulaArquiv.prototype.contaFuncCC = function () {
  758.     console.log("%c" + "Alimento array de CC para o datatable", "color: #80ff00;");
  759.     let arrayDeCCConta = new Array(0);
  760.     for (let i = 0; i < retornoDataTableCC.length; i++) {
  761.         arrayDeCCConta.push(retornoDataTableCC[i][0]);
  762.     }
  763.     return arrayDeCCConta;
  764. }
  765.  
  766. /*  Cria o datatable que lista o rateio por centro de custo */
  767. manipulaArquiv.prototype.dataTableRateio = function () {
  768.     console.log("%c" + "Construindo o datatable de rateio por CC", "color: #40ff00;");
  769.     retornoDataTableCC = new Array(0);
  770.  
  771.     // Prepara estrutura para o datatable
  772.     for (var iii = 0; iii < rateioPorCCSomado.length; iii++) {
  773.         retornoDataTableCC.push(new Array(
  774.             rateioPorCCSomado[iii]["CODCCUSTO"],
  775.             rateioPorCCSomado[iii]["NOME"],
  776.             rateioPorCCSomado[iii]["TOTAL"],
  777.             calcPercet(somaTotalGeral, rateioPorCCSomado[iii]["TOTAL"])
  778.         ));
  779.     }
  780.  
  781.     // Testar retorno
  782.     //console.log(retornoDataTableCC);
  783.  
  784.     var tabela = $('#tableRadioCC').dataTable();
  785.     tabela.fnDestroy();
  786.     $('#tableRadioCC').dataTable({
  787.         data: retornoDataTableCC,
  788.         "language": {
  789.             "url": "//cdn.datatables.net/plug-ins/1.10.19/i18n/Portuguese-Brasil.json"
  790.         },
  791.         "pageLength": 50,
  792.         columns: [
  793.             { title: "Centro de Custo" },
  794.             { title: "Descrição" },
  795.             { title: "Valor", "class": "moedaReal" },
  796.             {
  797.                 title: "Percentual",
  798.                 "class": "anexoTable fs-txt-center col-md-1",
  799.                 "orderable": false,
  800.                 "render": function (data, type, full, meta) {
  801.                     return full[3];
  802.                 }
  803.             }
  804.         ]
  805.     });
  806. }
  807.  
  808. // Agrupa valores gastos por chapa
  809. manipulaArquiv.prototype.agrupaChapas = function (ArrayASerProcessado) {
  810.     console.log("%c" + "Realizando agrupamento de chapas", "color: #00ffbf;");
  811.     var variavel = ArrayASerProcessado;
  812.  
  813.     var chapas = variavel.reduce((obj, { chapa, valor }) => {
  814.         //console.log(chapas);
  815.         if (!obj[chapa]) obj[chapa] = [];
  816.         obj[chapa].push(valor);
  817.         return obj;
  818.     }, {});
  819.  
  820.     var outraVariante = Object.keys(chapas).map(chapa => {
  821.         return {
  822.             chapa,
  823.             valores: chapas[chapa]
  824.         };
  825.     });
  826.     return outraVariante;
  827. }
  828.  
  829. // Soma os valores do beneficio por agrupamento de chapa
  830. manipulaArquiv.prototype.somaValoresChapasAgrupadas = function (arraySomar) {
  831.     console.log("%c" + "Somando valores por agrupamento de chapas", "color: #0080ff;");
  832.     // Aqui realiza a soma dos valores da propriedade "valor" dentro do objeto
  833.     var totalSomado = arraySomar.reduce((total, valores) => total + valores, 0);
  834.     // Resultado da soma
  835.     return totalSomado;
  836. }
  837.  
  838. // Calcula o total geral por chapa e popula o array
  839. manipulaArquiv.prototype.totalPorChapa = function (agrupamentoValores) {
  840.     console.log("%c" + "Total por chapa", "color: #ff00ff;");
  841.     var totalSomado = new Array(0);
  842.     for (i = 0; i < agrupamentoValores.length; i++) {
  843.         var valorSomado = variavelGlobal.somaValoresChapasAgrupadas(agrupamentoValores[i]['valores']);
  844.         totalSomado.push({
  845.             chapa: agrupamentoValores[i]["chapa"],
  846.             total: valorSomado
  847.         });
  848.     }
  849.     return totalSomado;
  850. }
  851.  
  852. // Calcula o total geral por chapa e popula o array
  853. manipulaArquiv.prototype.rateioPorCCFunc = function () {
  854.     console.log("%c" + "Rateio por CC do funcionário", "color: #ff8000;");
  855.     var output = retornoFuncinariosUA.map(s => ({ chapa: s.CHAPA, ...s }));
  856.     rateioPorCCSemAgrupar = new Array(0);
  857.  
  858.     for (let i = 0; i < output.length; i++) {
  859.         for (let j = 0; j < totalPorChapaV.length; j++) {
  860.             if (totalPorChapaV[j].chapa == output[i].chapa) {
  861.                 rateioPorCCSemAgrupar.push({
  862.                     CHAPA: totalPorChapaV[j].chapa,
  863.                     CODCCUSTO: output[i].CODCCUSTO,
  864.                     DESCCC: buscaCC(output[i].CODCCUSTO),
  865.                     RATEIO: output[i].RATEIO,
  866.                     VTOTAL: totalPorChapaV[j].total,
  867.                     VRATEIO: totalPorChapaV[j].total * parseFloat(output[i].RATEIO / 100)
  868.                 });
  869.             }
  870.         }
  871.     }
  872.     return rateioPorCCSemAgrupar;
  873. }
  874.  
  875. manipulaArquiv.prototype.agrupamentoCC = function (ArrayASerProcessado) {
  876.     console.log("%c" + "Novo agrupamento por CC do funcionário", "color: #ffff00;");
  877.     var variavel = ArrayASerProcessado;
  878.     rateioPorCCAgrupado = new Array(0);
  879.     var CCs = variavel.reduce((obj, { CODCCUSTO, VRATEIO }) => {
  880.         if (!obj[CODCCUSTO]) obj[CODCCUSTO] = [];
  881.         obj[CODCCUSTO].push(VRATEIO);
  882.         return obj;
  883.     }, {});
  884.  
  885.  
  886.     var outraVariante = Object.keys(CCs).map(CODCCUSTO => {
  887.         return {
  888.             CODCCUSTO,
  889.             valores: CCs[CODCCUSTO]
  890.         };
  891.     });
  892.     rateioPorCCAgrupado = outraVariante;
  893.     return outraVariante;
  894. }
  895.  
  896. manipulaArquiv.prototype.totalPorCC = function (agrupamentoValores) {
  897.     console.log("%c" + "Total por centro de custo", "color: #80ff00;");
  898.     var totalSomado = new Array(0);
  899.     rateioPorCCSomado = new Array(0);
  900.     for (i = 0; i < agrupamentoValores.length; i++) {
  901.         var valorSomado = variavelGlobal.somaValoresChapasAgrupadas(agrupamentoValores[i]['valores']);
  902.         totalSomado.push({
  903.             CODCCUSTO: agrupamentoValores[i]["CODCCUSTO"],
  904.             NOME: buscaCC(agrupamentoValores[i]["CODCCUSTO"]),
  905.             TOTAL: valorSomado
  906.         });
  907.     }
  908.     rateioPorCCSomado = totalSomado;
  909.     return totalSomado;
  910. }
  911.  
  912. manipulaArquiv.prototype.init = function (objetoCarregado) {
  913.  
  914.     /* Pega lista de chapas únicas e cunsulta dos dados dos funcionários listados  */
  915.     setTimeout(() => {
  916.    
  917.         valorAgrupadosPorFunc = variavelGlobal.agrupaChapas(objetoCarregado);
  918.         totalPorChapaV = variavelGlobal.totalPorChapa(valorAgrupadosPorFunc);
  919.  
  920.         somaTotalGeral = variavelGlobal.somaValoresNovoObjeto(objetoCarregado);
  921.         $("#valorTotalEspelho").val(somaTotalGeral);
  922.  
  923.         setTimeout(() => {
  924.             listaCentroDeCusto = variavelGlobal.removeCCRepetidos(retornoFuncinariosUA); /// retornoFuncinariosUA ou retornoFuncinarios
  925.             mostraCarregamento(dataTableRateioMsg, variavelGlobal.consultaCentroDeCusto, listaCentroDeCusto);   // Linha 773    Busca o nome do centro de custo no RM
  926.             setTimeout(() => {
  927.                 mostraCarregamento(dataTableRateioMsg, variavelGlobal.rateioPorCCFunc); // 740
  928.                 setTimeout(() => {
  929.                     mostraCarregamento(dataTableRateioMsg, variavelGlobal.agrupamentoCC, rateioPorCCSemAgrupar);     // aqui esta dando erro - gargalo aqui
  930.                     setTimeout(() => {
  931.                         mostraCarregamento(dataTableRateioMsg, variavelGlobal.totalPorCC, rateioPorCCAgrupado);
  932.                         setTimeout(() => {
  933.                             mostraCarregamento(dataTableRateioMsg, variavelGlobal.dataTableRateio);
  934.                             /* Carrega dos dataTables de rateio e falhas de importação */
  935.                             setTimeout(() => {
  936.                                 mostraCarregamento(dataTableFalhasDeImportacaoMsg, variavelGlobal.dataTableFalhasDeImportacao, objetoCarregado);
  937.                                 setTimeout(() => {
  938.                                     mostraCarregamento(mudaChapaMsg, variavelGlobal.mudaChapa);
  939.                                     setTimeout(() => {
  940.                                         mapeiaAlteracaoDeChapa();
  941.                                         setTimeout(() => {
  942.                                             // JSON
  943.                                             CSVcompletoSemTratamento = JSON.stringify(depurarObjeto); // Irá armazera um JSON com os dados do espelho
  944.                                             objetoTratado = JSON.stringify(novoObjeto); // Irá armazera um JSON com os dados tratados do espelho
  945.                                             objetoCorrigido = JSON.stringify(novoObjetoCorrigido) > 0 ? JSON.stringify(novoObjetoCorrigido) : JSON.stringify(novoObjeto); // Irá armazera um JSON com os dados corrigidos do espelho
  946.                                             $("#CSVcompletoSemTratamento").val(CSVcompletoSemTratamento);
  947.                                             $("#objetoTratado").val(objetoTratado);
  948.                                             $("#objetoCorrigido").val(objetoCorrigido);
  949.                                         }, 300);
  950.                                     }, 300);
  951.                                 }, 300);
  952.                             }, 300);
  953.                         }, 300);
  954.                     }, 300);
  955.                 }, 300);
  956.             }, 300);
  957.         }, 299);
  958.     }, 500);
  959. }
  960.  
  961. // Essa é a função que irá regerar o arquivo de imoprtação
  962. manipulaArquiv.prototype.correcaoDeDivergencias = function (params) {
  963.     console.log("%c" + "Correção de divergências", "color: #80ff00;");
  964.     variavelGlobal.init(novoObjetoCorrigido);
  965. }
  966.  
  967.  
  968. /* *****************************************
  969. Função mágica */
  970.  
  971. manipulaArquiv.prototype.pegaArquivoDoInput = function (evt) {
  972.     console.clear();
  973.     clear();
  974.     console.log("Mudou arquivo - pegaArquivoDoInput");
  975.     novoObjeto = new Array(0); // Limpar novo objeto sempre que carregar um novo arquivo
  976.     depurarObjeto = new Array(0); // Limpar novo objeto sempre que carregar um novo arquivo
  977.     retornoFuncinarios = new Array(0); // Limpar novo objeto sempre que carregar um novo arquivo
  978.     contadorDeLinhas = 0;
  979.     var files = evt.target.files;
  980.     var file = files[0];
  981.     var r = /\.(TXT)$/;
  982.     if (r.test(file.name.toUpperCase())) {
  983.         var carregandoArquivoTXT = variavelGlobal.lerArquivo(file);
  984.         mostraCarregamento(msgTxt, carregandoArquivoTXT);
  985.  
  986.     } else {
  987.         FLUIGC.toast({ title: 'Por Favor:', message: 'Envie um arquivo no formato TXT (.txt)', type: 'warning' });
  988.     }
  989.  
  990.     variavelGlobal.init(novoObjeto);
  991.  
  992. }
  993.  
  994. /* Inicialização do documento */
  995. var variavelGlobal = new manipulaArquiv(true);
  996.  
  997. $(document).ready(function () {
  998.     console.clear();
  999.     /* Essa é a primeira chamanda; Quando o usuário solicitar o carregamento do TXT da operadora.
  1000.        as demais execuções serão feitas pela função pegaArquivoDoInput */
  1001.     $("#inputBotaoAnexoEspelho").on('change', variavelGlobal.pegaArquivoDoInput);
  1002.  
  1003.     // Para teste, o campo não estava limpando ao recarregar o formulário
  1004.     $("#valorTotalEspelho").val("");
  1005.  
  1006.     $("#regerarEspelho").on("click", variavelGlobal.correcaoDeDivergencias);
  1007.  
  1008. });
  1009.  
  1010. /* Fim fazer teste e remover */
  1011. var logTitle = function (title) {
  1012.     console.log("%c--------------------------------", "color: red ;font-weight:bold;");
  1013.     console.log(title);
  1014.     return "--------------------------------";
  1015. }
RAW Paste Data