$(document).ready(async function () {

    // $('#tutorial').on('click', function () {
    //   $(document).ready(async function () {
    //     const driver = new Driver({
    //       doneBtnText: 'Sair',
    //       closeBtnText: 'Fechar',
    //       nextBtnText: 'Próximo',
    //       prevBtnText: 'Anterior',
    //       allowClose: false
    //     });
    //     driver.defineSteps([{
    //       element: '#btnFiltros',
    //       popover: {
    //         title: 'Botão Filtros',
    //         description: 'Clique aqui para abrir os filtros e realizar alguma consulta.',
    //         position: 'right'
    //       }
    //     },
    //     {
    //       element: '#btnImprimir',
    //       popover: {
    //         title: 'Botão Imprimir',
    //         description: 'Clique aqui para Imprimir um relatório.',
    //         position: 'right'
    //       }
    //     }
    //     ]);
    //     driver.start();
    //   });
    // });
  
    iniciaTela();

    $('#txtOrdemProducaoRelFaccao').autocompleta(1, `JSON={ "tabela":"OF1", "camposSelect":["NUMERO CHAVE", "CODIGO DESCRICAO"], "where": null}`);
    $('#txtMovimentoRelFaccao').pesquisa_variosServerside(1, `{ "tabela":"FACCAO", "camposSelect":["MOV", "INSUMO"], "where": null, "groupby": ["MOV", "NUMERO"]}`, 'MOV', 'NUMERO');    
    $('#txtSetorRelFaccao').autocompleta(1, `JSON={ "tabela":"CADFLUXO", "camposSelect":["CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}`);
    $('#txtFaccaoRelFaccao').autocompleta(1, `JSON={ "tabela":"ENTIDADE", "camposSelect":["CODCLI CHAVE", "NOME DESCRICAO"], "where": ["ATIVO = 'S'"]}`);
    $('#txtCorRelFaccao').pesquisa_variosServerside(1, `{ "tabela":"CADCOR", "camposSelect":["COR", "DESCRICAO"], "where": null}`, 'COR', 'DESCRICAO');
    $('#txtGrupoRelFaccao').pesquisa_variosServerside(1, `{ "tabela":"GRUPO_MA", "camposSelect":["CODIGO", "DESCRICAO"], "where": null}`, 'CODIGO', 'DESCRICAO');
    $('#txtLancamentoRelFaccao').autocompleta(1, `JSON={ "tabela":"FACCAO", "camposSelect":["LANCTO CHAVE", "NUMERO DESCRICAO"], "where": null}`);
      
    $('#btnOrdemProducaoRelFaccao').pesquisa_serverside(['#txtOrdemProducaoRelFaccao'], ['NUMERO'], ['CODIGO'], '{"tabela":"OF1", "camposSelect":["NUMERO", "CODIGO"], "where": null}', 'Pesquisa de Ordem de Produção');
    $('#btnMovimentoRelFaccao').pesquisa_serversideSel('#txtMovimentoRelFaccao', `{ "tabela":"FACCAO", "camposSelect":["MOV", "NUMERO"], "where": null, "groupby": ["MOV", "NUMERO"]}`, 'Pesquisa de Movimento');
    $('#btnSetorRelFaccao').pesquisa('#txtSetorRelFaccao', 'CODIGO', 'DESCRICAO', `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"CADFLUXO", "camposSelect":["CODIGO", "DESCRICAO"]}`, 'Pesquisa Setores', 'CADFLUXO', undefined, () => {$("#txtSetorRelFaccao").trigger("blur"); $("#txtSetorRelFaccao").trigger("change");});
    $('#btnFaccaoRelFaccao').pesquisa_serverside(['#txtFaccaoRelFaccao'], ['CODCLI'], ['NOME'], `{"tabela":"ENTIDADE", "camposSelect":["CODCLI", "NOME"], "where": ["ATIVO = 'S'"]}`, 'Pesquisa de Facção');
    $('#btnCorRelFaccao').pesquisa_serversideSel('#txtCorRelFaccao', `{ "tabela":"CADCOR", "camposSelect":["COR", "DESCRICAO"], "where": null}`, 'Pesquisa de Cores');
    $('#btnGrupoRelFaccao').pesquisa_serversideSel('#txtGrupoRelFaccao', `{ "tabela":"GRUPO_MA", "camposSelect":["CODIGO", "DESCRICAO"], "where": null}`, 'Pesquisa de Grupo');
    $('#btnLancamentoRelFaccao').pesquisa_serverside(['#txtLancamentoRelFaccao'], ['LANCTO'], ['NUMERO'], `{"tabela":"FACCAO", "camposSelect":["LANCTO", "NUMERO"], "where": null}`, 'Pesquisa de Lançamentos');  
  
    $("#btnLimpaOrdemProducaoRelFaccao").on("click", function () {
      $("#txtOrdemProducaoRelFaccao").val("");
      bloqueiaCampoMovimento(true);
    })
  
    $("#btnLimpaMovimentoRelFaccao").on("click", function() {
      $("#txtMovimentoRelFaccao").empty().trigger('change');
    })
  
    $("#btnLimpaSetorRelFaccao").on("click", function () {
      $("#txtSetorRelFaccao").val("");
      bloqueiaCampoMovimento(true);
    })
  
    $("#btnLimpaFaccaoRelFaccao").on("click", function () {
      $("#txtFaccaoRelFaccao").val("");
    })
  
    $("#btnLimpaCorRelFaccao").on("click", function () {
      $("#txtCorRelFaccao").empty().trigger("change");
    })
  
    $("#btnLimpaGrupoRelFaccao").on("click", function () {
      $("#txtGrupoRelFaccao").empty().trigger("change");
    })
  
    $("#btnLimpaLancamentoRelFaccao").on("click", function () {
      $("#txtLancamentoRelFaccao").val("");
    })
  
    $("#btnLimpaSetorConsumosRelFaccao").on("click", function () {
      $("#txtSetorConsumosRelFaccao").empty().trigger("change");
    })
  
    $("#btnLimpaParteConsumosRelFaccao").on("click", function () {
      $("#txtParteConsumosRelFaccao").empty().trigger("change");
    })
  
    $("#btnLimpaAplicacaoConsumosRelFaccao").on("click", function () {
      $("#txtAplicacaoConsumosRelFaccao").empty().trigger("change");
    })
  
    $("#txtOrdemProducaoRelFaccao").on("change", async function () {
      const ordemProducao = pegaChave(this);
      montaPesquisaFiltrosConsumos();
      await carregaPartes(ordemProducao);
    })

    $("#txtOrdemProducaRelFaccao").on("blur", function () {
      const ordemProducao = pegaChave(this);
      const setor = pegaChave("#txtSetorRelFaccao");
      if (ordemProducao != "" && setor != "") {
        bloqueiaCampoMovimento(false);
        montaPesquisaMovimento(ordemProducao, setor);
      } else {
        bloqueiaCampoMovimento(true)
      }
    })
  
    $("#btnConsultarRelFaccao").on("click", async function () {
      $.LoadingOverlay("show");
      const ordemProducao = pegaChave("#txtOrdemProducaoRelFaccao");
      const dataSaida = $("#txtDataSaidaRelFaccao").val();
      const setor = pegaChave("#txtSetorRelFaccao");

      try {

        if (ordemProducao == "") {
          throw new Error("Necessário informar o campo número.");
        }
  
        if (dataSaida == "") {
          throw new Error("Necessário informar o campo data saída.");
        }
  
        if (setor == "") {
          throw new Error("Necessário informar o campo setor.");
        }

        await eventoClickBtnConsultarRelFaccao();
      } catch (error) {
        msgAlerta(error.message);
        console.log(error);
      } finally {
        $.LoadingOverlay("hide");
      } 
    })
  
    $("#btnImprimirRelFaccao").on("click", async function () {
      $.LoadingOverlay("show");
      try {
        await imprimirRelFaccao();
      } finally {
        $.LoadingOverlay("hide")
      }
    })
  
    $("#btnGravarPrecoRelFaccao").on("click", async function () {
      $.LoadingOverlay("show");
      try {
        await gravarPrecoRelFaccao();
        await eventoClickBtnConsultarRelFaccao();
      } finally {
        $.LoadingOverlay("hide");
      }
    })
  
    $("#btnGravarObservacaoRelFaccao").on("click", async function () {
      $.LoadingOverlay("show");
      try {
        await gravarObservacaoRelFaccao();
      } finally {
        $.LoadingOverlay("hide");
      }
    })
  
    $("#cbSetorConsumosRelFaccao, #cbParteConsumosRelFaccao, #cbAplicacaoConsumosRelFaccao").on("click", function () {
      if ($("#cbSetorConsumosRelFaccao").prop("checked") || $("#cbParteConsumosRelFaccao").prop("checked") || $("#cbAplicacaoConsumosRelFaccao").prop("checked")) {
        $("#divGrupoRelFaccao").removeClass("d-none");
        $("#divSetorConsumosRelFaccao").removeClass("d-none");
        $("#divParteConsumosRelFaccao").removeClass("d-none");
        $("#divAplicacaoConsumosRelFaccao").removeClass("d-none");
      } else {
        $("#divGrupoRelFaccao").addClass("d-none");
        $("#divSetorConsumosRelFaccao").addClass("d-none");
        $("#divParteConsumosRelFaccao").addClass("d-none");
        $("#divAplicacaoConsumosRelFaccao").addClass("d-none");
      }
    })
  
    $("#txtSetorRelFaccao").on("change", async function () {
      $.LoadingOverlay("show");
      try {
        const observacao = await retornaObservacaoRelFaccao();
        $("#txtObservacaoRelFaccao").val(observacao);
      } finally {
        $.LoadingOverlay("hide");
      }
    })

    $("#txtSetorRelFaccao").on("blur", function () {
      const ordemProducao = pegaChave("#txtOrdemProducaoRelFaccao");
      const setor = pegaChave(this);
      if (ordemProducao != "" && setor != "") {
        bloqueiaCampoMovimento(false);
        montaPesquisaMovimento(ordemProducao, setor);
      } else {
        bloqueiaCampoMovimento(true);
      }
    })

    $("#txtParteRelFaccao").on("change", function () {
      if ($(this).val() == "") {
        $("#txtPrecoCertoRelFaccao").val("");
        $("#txtPrecoRelFaccao").val("");
        $("#txtPrecoRelFaccao").attr("disabled", true);
      } else {
        $("#txtPrecoRelFaccao").attr("disabled", false);
      }
      limparGrids();
    })

    $('#abaComposicaoRelFaccao').on('shown.bs.collapse', function () {
      if ($.fn.DataTable.isDataTable("#tabelaComposicaoRelFaccao")) {
        $('#tabelaComposicaoRelFaccao').DataTable().columns.adjust().draw(false);
      }
    });

    function iniciaTela() {
      montaPesquisaFiltrosConsumos();
      retornaHintRelatorio('btnImprimirRelFaccao', 'relfaccao');
    }
  
    async function consultarRelFaccao() {
      const params = await retornaFiltros();
      const url = `/sisplan/relenviofaccao/v1/consultarelfaccao?`;
      try {
  
        const response = await requisicao('GET', url, params, '', 360000);
  
        if (!response) {
          throw new Error("Não foi possível realizar a consulta do relatório de facção.");
        }
  
        const json = await response.json();
        if (response.status != 200) {
          throw new Error(json.mensagem);
        }
  
        return json;
  
      } catch (error) {
        msgAlerta(error.message);
        console.error(error);
      }
  
    }
  
    async function retornaFiltros() {
      const ordemProducao = pegaChave("#txtOrdemProducaoRelFaccao");
      const dataSaida = $("#txtDataSaidaRelFaccao").val();
      const movimento = await formataListas($("#txtMovimentoRelFaccao").val().toString()); 
      const setor = pegaChave("#txtSetorRelFaccao");
      const descSetor = pegaDescricao("#txtSetorRelFaccao");
      const parte = $("#txtParteRelFaccao").val();
      const faccao = pegaChave("#txtFaccaoRelFaccao");
      const cor = await formataListas($('#txtCorRelFaccao').val().toString()); 
      const grupo = await formataListas($("#txtGrupoRelFaccao").val().toString());
      const peso = $("#txtPesoRelFaccao").val();
      const lancamento = $("#txtLancamentoRelFaccao").val();
      const checkSetor = $("#cbSetorConsumosRelFaccao").prop("checked");
      const setorConsumos = await formataListas($("#txtSetorConsumosRelFaccao").val().toString());
      const checkParte = $("#cbSetorConsumosRelFaccao").prop("checked");
      const parteConsumos = await formataListas($("#txtParteConsumosRelFaccao").val().toString());
      const checkAplicacao = $("#cbSetorConsumosRelFaccao").prop("checked");
      const aplicacaoConsumos = await formataListas($("#txtAplicacaoConsumosRelFaccao").val().toString());
      const observacao = $("#txtObservacaoRelFaccao").val();
  
  
      return `ORDEM_PRODUCAO=${ordemProducao}` +
             `&DATA_SAIDA=${dataSaida}` +
             `&MOVIMENTO=${movimento}` +
             `&SETOR=${setor}` +
             `&DESC_SETOR=${descSetor}` +
             `&PARTE=${parte}` +
             `&FACCAO=${faccao}` +
             `&COR=${cor}` +
             `&GRUPO=${grupo}`+
             `&PESO=${peso}`+
             `&LANCAMENTO=${lancamento}`+
             `&CHECK_SETOR=${checkSetor}`+
             `&SETOR_CONSUMOS=${setorConsumos}`+
             `&CHECK_PARTE=${checkParte}`+
             `&PARTE_CONSUMOS=${parteConsumos}`+
             `&CHECK_APLICACAO=${checkAplicacao}`+
             `&APLICACAO_CONSUMOS=${aplicacaoConsumos}`+
             `&OBSERVACAO=${observacao}`;
    }
  
    async function gravarPrecoRelFaccao() {
      const url = "/sisplan/relenviofaccao/v1/gravarpreco?";
      // const precoMaximo = await retornaPrecoMaximo();
      const preco = $("#txtPrecoRelFaccao").val();
      const lancamento = $("#txtLancamentoRelFaccao").val();
      const dadosTabelaFaccao = $("#tabelaFaccaoRelFaccao").DataTable().data().toArray();
      try {
  
        if (dadosTabelaFaccao.length == 0) {
          throw new Error("Não foi possível gravar o preço. Não existem informações no grid.");
        } else {
          // if (preco > precoMaximo) {
          //   throw new Error("Não foi possível realizar a ação. Preço maior que o permitido.")
          // }
  
          const response = await requisicao("PUT", url, `LANCAMENTO${lancamento}&PRECO=${preco}`, `&JSON=${JSON.stringify(dadosTabelaFaccao)}`, 360000);
  
          if (!response) {
            throw new Error("Não foi possível gravar o preço.");
          }
  
          if (response.status != 200) {
            const json = await response.json();
            throw new Error(json.mensagem);
          }
  
        }
  
      } catch (error) {
        msgAlerta(error.message);
        console.log(error);
      }
  
    }
  
    async function gravarObservacaoRelFaccao() {
      const ordemProducao = pegaChave("#txtOrdemProducaoRelFaccao");
      const movimento = await formataListas($("#txtMovimentoRelFaccao").val().toString()); 
      const faccao = pegaChave("#txtFaccaoRelFaccao");
      const setor = pegaChave("#txtSetorRelFaccao");
      const parte = $("#txtParteRelFaccao").val();
      const observacao = $("#txtObservacaoRelFaccao").val();
      const url = `/sisplan/relenviofaccao/v1/observacaomovimento?`;
      const params = `ORDEM_PRODUCAO=${ordemProducao}`+
                     `&MOVIMENTO=${movimento}`+
                     `&FACCAO=${faccao}`+
                     `&SETOR=${setor}`+
                     `&PARTE=${parte}`+
                     `&OBSERVACAO=${encodeURIComponent(observacao)}`;
      try {

        if (ordemProducao == "") {
          throw new Error("Necessário informar o campo número.");
        }
  
        if (setor == "") {
          throw new Error("Necessário informar o campo setor.");
        }
  
        if (parte == "") {
          throw new Error("Necessário informar o campo parte.");
        }
  
        const response = await requisicao('PUT', url, params, "", 360000);
  
        if (!response) {
          throw new Error("Não foi possível gravar a observação.");
        }
  
        if (response.status != 200) {
          const json = await response.json();
          throw new Error(json.mensagem);
        }

        criaMensagemSucesso('Observação gravada com sucesso!', () => {}, () => {});
        
      } catch (error) {
        msgAlerta(error.message);
        console.error(error);
      }
  
    }
  
    function montaPesquisaFiltrosConsumos() {
      const ordemProducao = pegaChave("#txtOrdemProducaoRelFaccao");
      
      $('#txtSetorConsumosRelFaccao').pesquisa_variosServerside(1, `{ "tabela":"FAC_SETOR", "camposSelect":["SETOR", "DESCRICAO"], "where": ${ordemProducao != "" ? `["FAC_SETOR.NUMERO = '${ordemProducao}'"]` : "null"}, "innerJoin": [{"tabela": "CADFLUXO", "condicao": "FAC_SETOR.SETOR = CADFLUXO.CODIGO"}], "groupBy": ["SETOR", "DESCRICAO"]}`, 'SETOR', 'DESCRICAO');
      $('#txtParteConsumosRelFaccao').pesquisa_variosServerside(1, `{ "tabela":"OF1", "camposSelect":["PCPFT2.PARTE", "TIPO_APL.DESCRICAO"], "where": ${ordemProducao != "" ? `["OF1.NUMERO = '${ordemProducao}'"]` : "null"}, "leftJoin": [{"tabela": "TIPO_APL", "condicao": "OF1.PARTE = TIPO_APL.CODIGO"}, {"tabela": "PCPFT2", "condicao": "PCPFT2.CODIGO = OF1.CODIGO"}], "groupBy": ["PCPFT2.PARTE", "TIPO_APL.DESCRICAO"]}`, 'PARTE', 'DESCRICAO');
      $('#txtAplicacaoConsumosRelFaccao').pesquisa_variosServerside(1, `{ "tabela":"OF1", "camposSelect":["PCPFT2.APLICACAO", "PCPAPL.DESCRICAO"], "where": ${ordemProducao != "" ? `["OF1.NUMERO = '${ordemProducao}'"]` : "null"}, "leftJoin": [{"tabela": "PCPFT2", "condicao": "PCPFT2.CODIGO = OF1.CODIGO"}, {"tabela": "PCPAPL", "condicao": "PCPFT2.APLICACAO = PCPAPL.CODIGO"}], "groupBy": ["APLICACAO", "DESCRICAO"]}`, 'APLICACAO', 'DESCRICAO');
  
      $('#btnSetorConsumosRelFaccao').pesquisa_serversideSel('#txtSetorConsumosRelFaccao', `{ "tabela":"FAC_SETOR", "camposSelect":["SETOR", "DESCRICAO"], "where": ${ordemProducao != "" ? `["FAC_SETOR.NUMERO = '${ordemProducao}'"]` : "null"}, "innerJoin": [{"tabela": "CADFLUXO", "condicao": "FAC_SETOR.SETOR = CADFLUXO.CODIGO"}], "groupBy": ["SETOR", "DESCRICAO"]}`, 'Pesquisa de Setor');
      $('#btnParteConsumosRelFaccao').pesquisa_serversideSel('#txtParteConsumosRelFaccao', `{ "tabela":"OF1", "camposSelect":["PCPFT2.PARTE", "TIPO_APL.DESCRICAO"], "where": ${ordemProducao != "" ? `["OF1.NUMERO = '${ordemProducao}'"]`: "null"}, "leftJoin": [{"tabela": "TIPO_APL", "condicao": "OF1.PARTE = TIPO_APL.CODIGO"}, {"tabela": "PCPFT2", "condicao": "PCPFT2.CODIGO = OF1.CODIGO"}], "groupBy": ["PCPFT2.PARTE", "TIPO_APL.DESCRICAO"]}`, 'Pesquisa de Parte');
      $('#btnAplicacaoConsumosRelFaccao').pesquisa_serversideSel('#txtAplicacaoConsumosRelFaccao', `{ "tabela":"OF1", "camposSelect":["PCPFT2.APLICACAO", "PCPAPL.DESCRICAO"], "where": ${ordemProducao != "" ? `["OF1.NUMERO = '${ordemProducao}'"]` : "null"}, "leftJoin": [{"tabela": "PCPFT2", "condicao": "PCPFT2.CODIGO = OF1.CODIGO"}, {"tabela": "PCPAPL", "condicao": "PCPFT2.APLICACAO = PCPAPL.CODIGO"}], "groupBy": ["PCPFT2.APLICACAO", "PCPAPL.DESCRICAO"]}`, 'Pesquisa de Aplicação');
  
    }
  
    function preencheTabelaFaccao(registros) {
  
      if ($.fn.DataTable.isDataTable('#tabelaFaccaoRelFaccao')) {
        $("#tabelaFaccaoRelFaccao").DataTable().data().clear().draw(false);
      }
  
      if (registros.length > 0) {
  
        const dataSetCols = [];
        const keys = Object.keys(registros[0]);
        for (var k in keys) {
            dataSetCols.push({
                'title': keys[k],
                'data': keys[k]
            });
        };
  
        criaDataTablePadrao('#tabelaFaccaoRelFaccao',
                            false,
                            false,
                            false,
                            false,
                            true,
                            true,
                            false,
                            registros,
                            dataSetCols);
  
      }
  
    }
  
    function preencheTabelaConsumos(registros) {
      
      if ($.fn.DataTable.isDataTable("#tabelaConsumosRelFaccao")) {
        $("#tabelaConsumosRelFaccao").DataTable().data().clear().draw(false);
      }
  
      if (registros.length > 0) {
        const dataSetCols = [];
        const keys = Object.keys(registros[0]);
        for (var k in keys) {
            dataSetCols.push({
                'title': keys[k],
                'data': keys[k]
            });
        };
  
        criaDataTablePadrao('#tabelaConsumosRelFaccao',
                            false,
                            false,
                            false,
                            false,
                            true,
                            true,
                            false,
                            registros,
                            dataSetCols,
                            [34]);
  
        $('#tabelaConsumosRelFaccao tbody').unbind('click');
        $('#tabelaConsumosRelFaccao tbody').on('click', 'tr', async function () {
            // if ($(this).hasClass('selected')) {
            //     $(this).removeClass('selected');
            // } else {
                $('#tabelaConsumosRelFaccao').DataTable().$('tr.selected').removeClass('selected');
                $(this).addClass('selected');
                const dadosRow = $("#tabelaConsumosRelFaccao").DataTable().rows($(this)).data().toArray();
                const jsonComposicao = retornaJsonDadosComposicao(dadosRow.map(dados => dados.COMPOSICAO))
                preencheTabelaComposicao(jsonComposicao);
            // }
        });
  
        $($('#tabelaConsumosRelFaccao tbody tr')[0]).trigger('click');
      }
  
      
  
    }
  
    function preencheTabelaComposicao(registros) {
      if ($.fn.DataTable.isDataTable("#tabelaComposicaoRelFaccao")) {
        $("#tabelaComposicaoRelFaccao").DataTable().data().clear().draw(false);
        $("#tabelaComposicaoRelFaccao").DataTable().rows.add(registros).draw(false);
      } else {
        if (registros.length > 0) {
          const dataSetCols = [];
          const keys = Object.keys(registros[0]);
          for (var k in keys) {
              dataSetCols.push({
                  'title': keys[k],
                  'data': keys[k]
              });
          };
    
          criaDataTablePadrao('#tabelaComposicaoRelFaccao',
                              false,
                              false,
                              false,
                              false,
                              true,
                              true,
                              false,
                              registros,
                              dataSetCols);
        }
      }
    }
  
    async function carregaPartes(ordemProducao) {
      try {
  
        if (ordemProducao == "") {
          return;
        }
        
        const responsePartes = await requisicao("GET", "/sisplan/funcoes/v1/pesquisa?", `JSON={"tabela": "FACCAO", "camposSelect": [" DISTINCT FACCAO.PARTE", "TIPO_APL.DESCRICAO"], "where": ["FACCAO.NUMERO = '${ordemProducao}'"], "leftJoin": [{"tabela": "TIPO_APL", "condicao": "FACCAO.PARTE = TIPO_APL.CODIGO"}], "orderBy": ["FACCAO.PARTE"]}`)
  
        if (!responsePartes) {
            return;
        }
  
        const json = await responsePartes.json();
        if (responsePartes.status != 200) {
            msgAlerta(json.RESULT[0].mensagem);
            return;
        }
  
        await insereValorPesquisaVarios('txtParteRelFaccao', 'PARTE', 'DESCRICAO', json.RESULT[0]);
        $("#txtParteRelFaccao").val("");
      
  
      } catch (error) {
        msgAlerta(error.message);
        console.error(error);
      }
    }
  
    function retornaJsonDadosComposicao(registros) {
      // return registros.map(registro => JSON.parse(registro.replaceAll("%", '"')));
      return JSON.parse(registros.toString().replaceAll("%", '"'));
    }
  
    async function retornaObservacaoRelFaccao() {
      const ordemProducao = pegaChave("#txtOrdemProducaoRelFaccao");
      const setor = pegaChave("#txtSetorRelFaccao");
      const movimento = await formataListas($("#txtMovimentoRelFaccao").val().toString()); 
      const parte = $("#txtParteRelFaccao").val();
      const url = `/sisplan/relenviofaccao/v1/observacaomovimento?`;
      const params = `ORDEM_PRODUCAO=${ordemProducao}`+
                     `&SETOR=${setor}`+
                     `&PARTE=${parte}`+
                     `&MOVIMENTO=${movimento}`;
      try {
  
        if (setor == "") {
          return;
        }
  
        const response = await requisicao('GET', url, params, '', 360000);
  
        if (!response) {
          throw new Error("Não foi possível consultar a observação.");
        }
  
        const observacao = await response.text();
        if (response.status != 200) {
          const json = await response.json();
          throw new Error(json.mensagem);
        }
  
        return observacao;
        
      } catch (error) {
        msgAlerta(error.message);
        console.error(error);
      }
  
    }

    async function imprimirRelFaccao() {
        try {
            const url = "/sisplan/impressao/v1/relfaccao?";
            const filtros = await retornaFiltros();
            const bImprimeAutomatico = await verificaImprimirAutomatico("RelFaccao");
            const arquivo = await GeraRelatorio(`${url}${filtros}`, "GET", 1000000, false, "RelFaccao");
            if (arquivo != undefined) {
                if (!bImprimeAutomatico) {
                    window.open(`${BASE_URI}/relatorios_api/pdf/${arquivo}`, '_blank');
                }
                await limparRelatorios();
            }   
        } catch (error) {
            console.error(error);
        }
    }

    function preencheCamposPreco(precoCerto, preco) {
      $("#txtPrecoCertoRelFaccao").val(precoCerto);
      $("#txtPrecoRelFaccao").val(preco);
    }

    function bloqueiaCampoMovimento(bloquear) {
      $("#txtMovimentoRelFaccao").attr("disabled", bloquear);
      $("#btnMovimentoRelFaccao").attr("disabled", bloquear);
      $("#btnLimpaMovimentoRelFaccao").attr("disabled", bloquear);
      if (bloquear) {
        $("#btnLimpaMovimentoRelFaccao").trigger("click");
      }
    }

    function montaPesquisaMovimento(ordemProducao, setor) {      
      $('#txtMovimentoRelFaccao').pesquisa_variosServerside(1, `{ "tabela":"FACCAO", "camposSelect":["MOV", "INSUMO"], "where": ["NUMERO = '${ordemProducao} AND OP = '${setor}''"], "groupby": ["MOV", "NUMERO"]}`, 'MOV', 'NUMERO');
      $('#btnMovimentoRelFaccao').pesquisa_serversideSel('#txtMovimentoRelFaccao', `{ "tabela":"FACCAO", "camposSelect":["MOV", "NUMERO"], "where": ["NUMERO = '${ordemProducao}' AND OP = '${setor}'"], "groupby": ["MOV", "NUMERO"]}`, 'Pesquisa de Movimento');
    }

    function limparGrids() {
      if ($.fn.DataTable.isDataTable('#tabelaFaccaoRelFaccao')) {
        $("#tabelaFaccaoRelFaccao").DataTable().data().clear().draw(false);
      }
      if ($.fn.DataTable.isDataTable('#tabelaConsumosRelFaccao')) {
        $("#tabelaConsumosRelFaccao").DataTable().data().clear().draw(false);
      }
      if ($.fn.DataTable.isDataTable('#tabelaComposicaoRelFaccao')) {
        $("#tabelaComposicaoRelFaccao").DataTable().data().clear().draw(false);
      }
    }

    async function retornaPrecoMaximo() {
      const url = "/sisplan/relenviofaccao/v1/retornaprecomaximo?";
      const ordemProducao = pegaChave("#txtOrdemProducaoRelFaccao");
      const parte = $("#txtParteRelFaccao").val();
      const setor = pegaChave("#txtSetorRelFaccao");
      const params = `ORDEM_PRODUCAO=${ordemProducao}`+
                     `&PARTE=${parte}`+
                     `&SETOR=${setor}`;

      try {

        const response = await requisicao("GET", url, params, "", 360000);

        if (!response) {
          return 0;
        }

        const json = await response.text();
        if (response.status != 200) {
          return 0;
        }

        return json;

      } catch (error) {
        console.error(error);
      }
    }

    async function eventoClickBtnConsultarRelFaccao() {
        const registros = await consultarRelFaccao();
        preencheTabelaFaccao(registros[0]);
        preencheTabelaConsumos(registros[1]);
        if (registros[0].length > 0) {
          preencheCamposPreco(registros[0][0].CAMPO_PRECO_CERTO, registros[0][0].CAMPO_PRECO)
        }
    }
    
    });