$('#tutorial').on('click', function () {
  $('#geral-tab').trigger('click');
  $(document).ready(async function () {
    const driver = new Driver({
      doneBtnText: 'Sair',
      closeBtnText: 'Fechar',
      nextBtnText: 'Próximo',
      prevBtnText: 'Anterior',
      allowClose: false,
      onHighlightStarted: (Element) => {
        if (Element.node.id == 'geral') {
          if (!$('#DadosGerais').hasClass('show'));
          $('#DadosGerais').collapse('show');
        }
      },
    });

    driver.defineSteps([{
      element: '#txtNumero',
      popover: {
        title: 'Número do Pedido',
        description: 'Aqui consta o número do pedido, caso seja uma inclusão o número inserido irá ser consultado.',
        position: 'top'
      }
    },
    {
      element: '#DadosGerais',
      popover: {
        title: 'Dados e Ações do Cancelamento',
        description: 'Esses são os campos que você irá preencher para realizar a gravação do cancelamento do pedido.',
        position: 'bottom'
      }
    },
    {
      element: '#cbBaixarEstoque',
      popover: {
        title: 'Baixar Estoque',
        description: 'Ao ser selecionado, irá baixar o estoque de toda a quantidade que está sendo cancelada e/ou faturada.',
        position: 'bottom'
      }
    },
    {
      element: '#cbExcluirReserva',
      popover: {
        title: 'Excluir Reserva',
        description: 'Ao ser selecionado, irá excluir toda a quantidade em expedição reserva.',
        position: 'bottom'
      }
    },
    {
      element: '#cbVoltaExpedicao',
      popover: {
        title: 'Volta Expedição',
        description: 'Ao ser selecionado, voltará toda a quantidade em expedição.',
        position: 'bottom'
      }
    },
    {
      element: '#opcoesQtde',
      popover: {
        title: 'Opções',
        description: 'Aqui existem algumas opções para manipular as quantidades de cancelamento e faturamento desse pedido.',
        position: 'bottom'
      }
    },
    {
      element: '#cbCancelarTotal',
      popover: {
        title: 'Cancelamento Total das Quantidades',
        description: 'Está primeira opção ao ser selecionada, passa para cancelado toda a quantidade pendente do grid.',
        position: 'bottom'
      }
    },
    {
      element: '#cbFatTotal',
      popover: {
        title: 'Faturamento Total das Quantidades',
        description: 'Está segunda opção ao ser selecionada, passa para faturada toda a quantidade pendente do grid.',
        position: 'bottom'
      }
    },
    {
      element: '#cbFatExpedicao',
      popover: {
        title: 'Faturamento Total das Quantidades',
        description: 'Está terceira opção ao ser selecionada, passa para faturada toda a quantidade pendente em expedição do grid.',
        position: 'bottom'
      }
    },
    {
      element: "#btnVoltar",
      popover: {
        title: "Botão Voltar",
        description:
          "Ao clicar nesse botão você retorna para a tela de consulta.",
        position: "left",
      },
    },
    {
      element: '#btnGravar',
      popover: {
        title: 'Botão Gravar',
        description: 'Ao clicar nesse botão você grava os dados inseridos.',
        position: 'left'
      }
    }
    ]);

    driver.start();
  });
});


$(document).ready(async function () {
  // linhaC = 1; 
  $('#txtCliente').autocompleta(1, `JSON={ "tabela":"ENTIDADE", "camposSelect":["CODCLI CHAVE", "NOME DESCRICAO"], "where": null}`);
  $('#txtGrupoProd').autocompleta(1, `JSON={ "tabela":"GRUPO_PA", "camposSelect":["CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}`);
  $('#txtMarca').autocompleta(1, `JSON={ "tabela":"MARCA", "camposSelect":["CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}`);
  $('#txtMotivo').autocompleta(1, `JSON={ "tabela":"MENSAGEM", "camposSelect":["CODMEN CHAVE", "DESCRICAO DESCRICAO"], "where": null}`);
  $("#txtDeposito").autocompleta(1, `JSON={ "tabela":"DEPOSITO", "camposSelect":[ "CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}`);
  $('#txtTipoMvto').autocompleta(1, `JSON={ "tabela":"TABBAI", "camposSelect":["CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}`);
  $('#txtQualidade').autocompleta(1, `JSON={ "tabela":"TABQUL", "camposSelect":["CODIGO CODIGO", "DESCRICAO DESCRICAO"], "where": null}`);
  $('#txtEtiqueta').autocompleta(1, `JSON={ "tabela":"ETQ_PROD", "camposSelect":["CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}`);

  // $('#btnCliente').pesquisa_serverside(['#txtCliente'], ['CODCLI'], ['NOME'], `{"tabela":"ENTIDADE", "camposSelect":[ "CODCLI", "NOME"], "where": null}`, 'Pesquisa de Cliente');
  $('#btnCliente').pesquisa_serverside(['#txtCliente'], ['CODCLI'], ['NOME'], '{"tabela":"ENTIDADE", "camposSelect":[ "CODCLI", "NOME"], "where": null}', 'Pesquisa Cliente');
  $('#btnGrupoProd').pesquisa('#txtGrupoProd', 'CODIGO', 'DESCRICAO', `/sisplan/funcoes/v1/pesquisa?JSON={"tabela":"GRUPO_PA", "camposSelect":[ "CODIGO", "DESCRICAO"]}`, 'Pesquisa Grupo Produto', 'GRUPO_PA');
  $('#btnMarca').pesquisa('#txtMarca', 'CODIGO', 'DESCRICAO', `/sisplan/funcoes/v1/pesquisa?JSON={"tabela":"MARCA", "camposSelect":[ "CODIGO", "DESCRICAO"]}`, 'Pesquisa Marca', 'MARCA');
  $('#btnMotivo').pesquisa('#txtMotivo', 'CODMEN', 'DESCRICAO', `/sisplan/funcoes/v1/pesquisa?JSON={"tabela":"MENSAGEM", "camposSelect":[ "CODMEN", "DESCRICAO"]}`, 'Pesquisa Motivo', 'MENSAGEM');
  $("#btnDeposito").pesquisa("#txtDeposito", "CODIGO", "DESCRICAO", `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"DEPOSITO", "camposSelect":[ "CODIGO", "DESCRICAO"]}`, "Pesquisa Depósito", "DEPOSITO");
  $('#btnTipoMvto').pesquisa('#txtTipoMvto', 'CODIGO', 'DESCRICAO', `/sisplan/funcoes/v1/pesquisa?JSON={"tabela":"TABBAI", "camposSelect":[ "CODIGO", "DESCRICAO"]}`, 'Pesquisa Tipo Movimento', 'TABBAI');
  $('#btnQualidade').pesquisa('#txtQualidade', 'CODIGO', 'DESCRICAO', `/sisplan/funcoes/v1/pesquisa?JSON={"tabela":"TABQUL", "camposSelect":[ "CODIGO", "DESCRICAO"]}`, 'Pesquisa Qualidade', 'TABQUL');
  $('#btnEtiqueta').pesquisa('#txtEtiqueta', 'CODIGO', 'DESCRICAO', `/sisplan/funcoes/v1/pesquisa?JSON={"tabela":"ETQ_PROD", "camposSelect":[ "CODIGO", "DESCRICAO"]}`, 'Pesquisa Etiqueta', 'ETQ_PROD');

  $('#btnLimpaCliente').on('click', function () {
    $('#txtCliente').val('');
  });

  $('#btnLimpaDeposito').on('click', function () {
    $('#txtDeposito').val('');
  });

  $('#btnLimpaMotivo').on('click', function () {
    $('#txtMotivo').val('');
  });

  $('#btnLimpaTipoMvto').on('click', function () {
    $('#txtTipoMvto').val('');
  });

  $('#btnLimpaQualidade').on('click', function () {
    $('#txtQualidade').val('');
  });

  $('#btnLimpaEtiqueta').on('click', function () {
    $('#txtEtiqueta').val('');
  });



  componenteFiltro('cliente', false, false)

  $('#txtNumero').autocompleta(
    1,
    `JSON={ "tabela":"PEDIDO", "camposSelect":["NUMERO CHAVE, CODCLI DESCRICAO"], "where": [] }`,
    ['#txtNumero', '#txtNumero'],
    ['CHAVE', 'DESCRICAO'],
    ['CHAVE', 'DESCRICAO'],
    () => null,
    [true],
    '',
    [],
    true,
  )
  $('#btnNumero').pesquisa_serverside(
    ['#txtNumero'],
    ['NUMERO', 'CODCLI'],
    ['NUMERO', 'CODCLI'],
    '{"tabela":"PEDIDO", "camposSelect":[ "NUMERO", "CODCLI"], "where": null}',
    'Pesquisa Pedido',
    () => null,
    [true]
  )

  let queryString = window.location.href;
  let parametros = queryString.split('/');
  let pedido = parametros[parametros.length - 1];

  $('#tabelaPedido').DataTable({
    paging: false,
    filter: false,
    info: false,
    order: [],
    colReorder: false,
    destroy: true,
    scrollY: '350px',
    columnDefs: [
      {
        "targets": [5, 6, 7, 10, 11],
        "className": 'pr-4 text-right'
      },
      {
        "targets": [9],
        "visible": false
      }
    ],
    createdRow: function (row, data, dataIndex) {
      $('td', row).eq(7).css('color', 'green');
      $('td', row).eq(9).css('color', 'red');
      $('td', row).eq(6).css('font-weight', 'bold');
      $('td', row).eq(7).css('font-weight', 'bold');
      $('td', row).eq(9).css('font-weight', 'bold');
    }
  });

  $('#txtNumero').on('blur', async function () {
    if ($('#txtNumero').val() && $('#txtNumero').val() != '') {
      let data = await buscaDadosPedidos($('#txtNumero').val());
      await insereDados(data);
    }
  });

  if (pedido != '' && pedido != 'create') {
    $('#txtNumero').val(pedido);
    try {
      $.LoadingOverlay("show");
      try {
        let data = await buscaDadosPedidos(pedido);
        // let reserva = await buscaQuantidadeReservada(data);
        await insereDados(data)
      } catch (error) {
        console.error(error);
        msgErro(`Não foi possível buscar os dados do tamanho: ${error}`);
      }
    } finally {
      $.LoadingOverlay('hide');
    }
  };

  async function insereDados(data) {
    $('#tabelaPedido').DataTable().rows().remove().draw(false);
    data.RESULT[0].map(item => {
      let linha = $('#tabelaPedido').DataTable().data().toArray().length > 0 ? $('#tabelaPedido').DataTable().data().toArray().length : 0;
      $('#tabelaPedido').DataTable().row.add([
        item.CODIGO,
        item.DESC_PRODUTO,
        item.COR,
        item.DESC_COR,
        item.TAM,
        item.PRECO_LIQ ? item.PRECO_LIQ.toFixed(2) : '0.00',
        item.QTDE_ORIG,
        item.QTDE,
        `<input id="txtCancelar_${linha}" type="number" class="inputTable inputsCancelar focus input-default form-control" style="max-width: 71px">`,
        `<input id="txtFaturada_${linha}" type="number" class="inputTable inputsFaturada focus input-default form-control">`,
        item.QTDE_CANC,
        item.QTDE_F,
        item.ID_ITEM_PED,
        item.ORDEM,
        item.RESERVADA,
        item.QTDE_RES_B,
        item.QUALIDADE,
        item.TIPO,
        item.EXPEDICAO
      ]).draw(false);

      $(`#txtCancelar_${linha}`).on('focusout', function () {
        const qtde = $(this).val();
        if (parseInt(qtde) > parseInt($('#tabelaPedido').DataTable().data()[linha][7])) {
          $(this).val(0)
          throw msgAlerta(`Quantidade a cancelar: ${qtde}, maior que o saldo do item do pedido: ${$('#tabelaPedido').DataTable().data()[linha][7]}, impossível continuar.`);
        }
      });
    });

    let pedcli = await buscaValor('PEDIDO', 'PED_CLI', 'NUMERO', $('#txtNumero').val());
    if (pedcli != undefined) {
      pedcli = pedcli.PED_CLI;
      $('#txtPedCliente').val(pedcli);
    }

    let cliente = await buscaValor('PEDIDO', 'CODCLI', 'NUMERO', $('#txtNumero').val());
    if (cliente != undefined) {
      cliente = cliente.CODCLI;
      insereValor('#txtCliente', cliente, { tabela: 'ENTIDADE', campoBusca: 'NOME', campoWhere: 'CODCLI', valorWhere: cliente });
    }

    let deposito = await buscaValor('PEDIDO', 'DEPOSITO', 'NUMERO', $('#txtNumero').val());
    if (deposito != undefined) {
      deposito = deposito.DEPOSITO;
      insereValor('#txtDeposito', deposito, { tabela: 'DEPOSITO', campoBusca: 'DESCRICAO', campoWhere: 'CODIGO', valorWhere: deposito });
    }

    if (await validaCheckReceber($('#txtNumero').val())) {
      if (await buscaParametroERP('VEN', '1010', '1', '1') == 'N') {
        $('#cbGerarReceber').prop('disabled', true)
      }
    }
  }

  async function validaCheckReceber(sPedido) {
    try {
      const dadosSelect = {
        tabela: 'RECEBER',
        camposSelect: ['NUMERO'],
        where: [`PEDIDO = '${sPedido}'`]
      };
      const retornoSelect = await retornaJsonPesquisaPadrao(JSON.stringify(dadosSelect));
      if (!retornoSelect) {
        return;
      }
      if (retornoSelect.length == 0) {
        return false;
      }
      return true;
    } catch (error) {
      console.error(error)
    }
  }

  $('#cbCancelarTotal').on('click', function () {
    $(`.inputsFaturada`).val('');
    for (let i = 0; i < $('#tabelaPedido').DataTable().data().length; i++) {
      $(`#txtCancelar_${i}`).val($('#tabelaPedido').DataTable().data()[i][7])
    }
  });

  // $('#cbFatTotal').on('click', function () {
  //   $(`.inputsCancelar`).val('');
  //   for (let i = 0; i < $('#tabelaPedido').DataTable().data().length; i++) {
  //     $(`#txtFaturada_${i}`).val($('#tabelaPedido').DataTable().data()[i][6])
  //   }
  // });

  // function buscaDadosTabela() {
  //   let arr = [];
  //   i = 1;
  //   $('#tabelaPedido').DataTable().rows().data().map(item => {
  //     arr.push({
  //       QTDE_CANC: $(`#txtCancelar_${i}`).val(),
  //       QTDE_F: $(`#txtFaturada_${i}`).val(),
  //     })
  //     i++
  //   });
  //   return arr;
  // };

  async function buscaDadosPedidos(pedido) {
    const whereCompleto = await montaWherePesquisa(pedido);
    const ligacaoCompleta = await montaLigacoesPesquisa();
    const camposCompleto = await montaCamposSelect();

    let dataSetCols = [];

    try {
      try {
        $.LoadingOverlay("show");

        for (let i = 0; i < camposCompleto.colunas.length; i++) {
          dataSetCols.push({
            'title': camposCompleto.colunas[i],
            'data': i
          });
        }

        let response = await requisicao(
          'GET', `/sisplan/funcoes/v1/pesquisa?`, `JSON={"tabela":"PED_ITEN", "camposSelect":${camposCompleto.camposSelect}, "leftjoin": [${ligacaoCompleta}], "where": ["1=1 ${whereCompleto}"]}`, 15000);

        if (!response) {
          return;
        }

        let jsonStr = await response.json();

        return jsonStr;

      } catch (error) {
        console.error(error);
        msgErro('Não foi possível buscar os dados.');
      }
    } finally {
      $.LoadingOverlay("hide");
      $('#modal-filtros').modal('hide');
    }
  };

  async function montaWherePesquisa(pedido) {
    let where = '';
    // AND PED_ITEN.CODIGO = '2001008'
    where += pedido != '' ? ` AND PED_ITEN.NUMERO = '${pedido}'` : '';
    // where += $('#txtCodigo').val() != '' ? ` AND PED_ITEN.CODIGO = '${$('#txtCodigo').val()}'` : '';
    where += ` AND (PED_ITEN.QTDE [SOMA] PED_ITEN.QTDE_CANC [SOMA] [SOMA] PED_ITEN.QTDE_F) > 0`;
    return where;
  }

  async function montaLigacoesPesquisa() {
    let ligacao = `{"tabela": "PEDIDO", "condicao": "(PED_ITEN.NUMERO = PEDIDO.NUMERO)"},` +
      `{"tabela": "MATERIAL", "condicao": "(PED_ITEN.CODIGO = MATERIAL.CODIGO)"},` +
      `{"tabela": "CADCOR", "condicao": "(PED_ITEN.COR = CADCOR.COR)"},` +
      `{"tabela": "COLECAO", "condicao": "(PEDIDO.COLECAO = COLECAO.CODIGO)"},` +
      `{"tabela": "TIPO", "condicao": "(TIPO.ID_TIPO = PEDIDO.ID_TIPO)"},` +
      `{"tabela": "PRODUTO", "condicao": "(PED_ITEN.CODIGO = PRODUTO.CODIGO)"},` +
      `{"tabela": "(SELECT CODIGO, COR, TAM, MIN(LOTE) LOTE, MAX(BARRA) BARRA FROM [PA_ITEN] GROUP BY CODIGO, COR, TAM)",
        "tabelaSelect": "(SELECT CODIGO, COR, TAM, MIN(LOTE) LOTE, MAX(BARRA) BARRA FROM [PA_ITEN] GROUP BY CODIGO, COR, TAM)",
        "condicao": "(PA.CODIGO = PED_ITEN.CODIGO AND PA.COR = PED_ITEN.COR AND PA.TAM = PED_ITEN.TAM)",
        "alias": "PA"},` +

      `{"tabela": "(SELECT PROG_COMPRA.CODIGO, PROG_COMPRA.COR, PROG_COMPRA.TAM, SUM(PROG_COMPRA.QUANTIDADE) QTDE FROM [PROG_COMPRA] PROG_COMPRA 
                    INNER JOIN [TABPRZ] TABPRZ ON (TABPRZ.PRAZO = PROG_COMPRA.PERIODO) WHERE TABPRZ.ATIVO_PRODUCAO = 'S' GROUP BY PROG_COMPRA.CODIGO, PROG_COMPRA.COR, PROG_COMPRA.TAM)",
        "tabelaSelect": "(SELECT PROG_COMPRA.CODIGO, PROG_COMPRA.COR, PROG_COMPRA.TAM, SUM(PROG_COMPRA.QUANTIDADE) QTDE FROM [PROG_COMPRA] PROG_COMPRA 
                          INNER JOIN [TABPRZ] TABPRZ ON (TABPRZ.PRAZO = PROG_COMPRA.PERIODO) WHERE TABPRZ.ATIVO_PRODUCAO = 'S' GROUP BY PROG_COMPRA.CODIGO, PROG_COMPRA.COR, PROG_COMPRA.TAM)",
        "condicao": "(PROG_COMPRA.CODIGO = PED_ITEN.CODIGO AND PROG_COMPRA.COR = PED_ITEN.COR AND PROG_COMPRA.TAM = PED_ITEN.TAM)",
        "alias" : "PROG_COMPRA"},`+

      `{"tabela": "(SELECT PED_ITEN.CODIGO, PED_ITEN.COR, PED_ITEN.TAM, SUM(PED_ITEN.QTDE + PED_ITEN.QTDE_F) QTDE FROM [PED_ITEN] PED_ITEN GROUP BY PED_ITEN.CODIGO, PED_ITEN.COR, PED_ITEN.TAM)",
        "tabelaSelect":"(SELECT PED_ITEN.CODIGO, PED_ITEN.COR, PED_ITEN.TAM, SUM(PED_ITEN.QTDE [SOMA] PED_ITEN.QTDE_F) QTDE FROM [PED_ITEN] PED_ITEN GROUP BY PED_ITEN.CODIGO, PED_ITEN.COR, PED_ITEN.TAM)",
        "condicao": "(PEDTOTAL.CODIGO = PED_ITEN.CODIGO AND PEDTOTAL.COR = PED_ITEN.COR AND PEDTOTAL.TAM = PED_ITEN.TAM)",
        "alias": "PEDTOTAL"}`;

    return ligacao;
  }

  async function montaCamposSelect() {
    let camposSelect = [];
    let colunas = [];

    camposSelect = `["PED_ITEN.CODIGO", "PRODUTO.DESCRICAO DESC_PRODUTO", "MATERIAL.DESCRICAO DESC_MAT" ,"PED_ITEN.COR" ,"PED_ITEN.TAM" ,"PED_ITEN.TIPO"
      ,"PED_ITEN.QTDE", "PED_ITEN.QTDE_F", "PED_ITEN.QTDE_CANC", "PED_ITEN.PRECO", "PEDIDO.TAB_PRE", "PEDIDO.CODREP", "PED_ITEN.ORDEM", "PED_ITEN.QUALIDADE"
      ,"CADCOR.DESCRICAO DESC_COR", "PA.BARRA AS PA_BARRA", "(PED_ITEN.PRECO - ((PED_ITEN.PRECO*PEDIDO.PER_DESC)/100)) as PRECO_LIQ", "PED_ITEN.PROGRAMADO"
      ,"PED_ITEN.QTDE_F", "PED_ITEN.QTDE_ORIG", "PRODUTO.CODIGO2", "PED_ITEN.ID ID_ITEM_PED", "PEDIDO.COLECAO", "COLECAO.DESCRICAO DESC_COLECAO", "PEDIDO.ID_TIPO"
      ,"TIPO.DESCRICAO DESC_TIPO", "PROG_COMPRA.QTDE QTDE_PROJ", "PEDTOTAL.QTDE TOTAL_PED", "'000000' LOTE"
      ,"(SELECT SUM(QTDE) FROM [PED_RESERVA] WHERE NUMERO = '${$('#txtNumero').val()}' AND CODIGO = PED_ITEN.CODIGO AND COR = PED_ITEN.COR AND TAM = PED_ITEN.TAM) RESERVADA"
      ,"(SELECT SUM(QTDE_B) FROM [PED_RESERVA] WHERE NUMERO = '${$('#txtNumero').val()}' AND CODIGO = PED_ITEN.CODIGO AND COR = PED_ITEN.COR AND TAM = PED_ITEN.TAM) QTDE_RES_B"
      ,"(SELECT (SUM(QTDE)[SOMA]SUM(QTDE_F)) FROM [PEDIDO3] WHERE NUMERO = '${$('#txtNumero').val()}' AND CODIGO = PED_ITEN.CODIGO AND COR = PED_ITEN.COR AND TAM = PED_ITEN.TAM) EXPEDICAO"]`;

    colunas = ["CODIGO", "DESC_PRODUTO", "COR", "DESC_COR", "TAM", "PRECO_LIQ", "QTDE_ORIG", "QTDE", "CANCELADA", "FATURADA", "QTDE_CANC", "QTDE_F", "PRECO_LIQ",];

    return objeto = {
      camposSelect: camposSelect,
      colunas: colunas
    };
  }

  $('#btnVoltar').on('click', async function () {
    await deletaRegistro('CANCELAMENTO_PEDIDO', getCookie('usuario'), pedido);
    window.location.href = `${BASE_URI}/cancelamento_pedido`;
  });

  $('#btnVoltarFaturado').on('click', async function () {
    if (($('#txtDeposito').val() != '') && ($('#cbBaixarEstoque').is(':checked'))) {
      throw msgAlerta('Depósito precisa ser informado, verifique!');
    }

    if (($('#txtTipoMvto').val()) != '' && ($('#cbBaixarEstoque').is(':checked'))) {
      throw msgAlerta('Tipo motivo precisa ser informado, verifique!');
    }
    await msgAlerta(
      'Deseja voltar as quantidades faturadas?',
      async function () {
        await voltarQuantidadeFat();
      },
      async function () {
        () => { }
      }
    );
  });

  async function voltarQuantidadeFat() {
    try {
      $.LoadingOverlay('show');
      const ListaItensPedido = buscaDadosTabela();
      const params = buscaParams();

      let objeto = { ListaItensPedido };
      let response = await requisicao('POST', `/sisplan/cancelamentopedido/v1/voltarfaturado?`, '', `JSON=${JSON.stringify(objeto)}${params}`, 15000);

      if (!response) {
        return;
      }

      toastr.success(
        `Voltado quantidades faturadas!`,
        'Confirmação', {
        toastClass: 'alert',
        iconClasses: {
          error: 'alert-error',
          info: 'alert-info',
          success: 'alert-success',
          warning: 'alert-warning'
        },
        positionClass: "toast-top-center",
        progressBar: true,
        timeOut: 3000,
        fadeOut: 1000,
        onHidden() {
          window.location.href = `${BASE_URI}/cancelamento_pedido`;
        }
      }
      ).css({
        "margin-top": "20%",
        "width": "500px",
        "max-width": "500px"
      });

    } catch (err) {
      console.log(err)
    } finally {
      $.LoadingOverlay('hide');
    }
  }

  async function voltarQuantidadeCanc() {
    try {
      $.LoadingOverlay('show');
      const ListaItensPedido = buscaDadosTabela();
      const params = buscaParams();

      let objeto = { ListaItensPedido };
      let response = await requisicao('POST', `/sisplan/cancelamentopedido/v1/voltarcancelado?`, '', `JSON=${JSON.stringify(objeto)}${params}`, 15000);

      if (!response) {
        return;
      }

      toastr.success(
        `Voltado quantidades canceladas!`,
        'Confirmação', {
        toastClass: 'alert',
        iconClasses: {
          error: 'alert-error',
          info: 'alert-info',
          success: 'alert-success',
          warning: 'alert-warning'
        },
        positionClass: "toast-top-center",
        progressBar: true,
        timeOut: 3000,
        fadeOut: 1000,
        onHidden() {
          window.location.href = `${BASE_URI}/cancelamento_pedido`;
        }
      }
      ).css({
        "margin-top": "20%",
        "width": "500px",
        "max-width": "500px"
      });

    } catch (err) {
      console.log(err)
    } finally {
      $.LoadingOverlay('hide');
    }
  }

  function buscaDadosTabela() {
    const tabela = $('#tabelaPedido').DataTable().rows().data().toArray();
    let listaItensPedido = tabela.map((item, i) => {
      return {
        CODIGO: item[0],
        DESCRICAO: item[1],
        COR: item[2],
        DESCCOR: item[3],
        TAM: item[4],
        PRECOLIQ: item[5],
        QTDE_ORIG: item[6],
        QTDE: item[7],
        CANCELADA: $(`#txtCancelar_${i}`).val(),
        // FATURADA: $(`#txtFaturada_${i}`).val(),
        QTDE_CANC: item[10],
        QTDE_F: item[11],
        ID_ITEM_PED: item[12],
        ORDEM: item[13],
        RESERVADO: item[14],
        QTDE_RES_B: item[15],
        QUALIDADE: item[16],
        TIPO: item[17],
        EXPEDICAO: item[18],
      };
    });
    return listaItensPedido;
  }

  function buscaParams() {
    //CHECKBOX
    let sBaixar_estoque = $('#cbBaixarEstoque').is(':checked') ? 'S' : 'N';
    let sGerar_receber = $('#cbGerarReceber').is(':checked') ? 'S' : 'N';
    let sImpConfigurada = $('#cbImpressaoConfigurada').is(':checked') ? 'S' : 'N';
    let sExcluirReserva = $('#cbExcluirReserva').is(':checked') ? 'S' : 'N';
    let sSomenteQtdePendente = $('#cbSomenteQtdePendente').is(':checked') ? 'S' : 'N';
    let sVoltaExpedicao = $('#cbVoltaExpedicao').is(':checked') ? 'S' : 'N';
    let sUtiliza_barra = $('#cbUtilizaBarra').is(':checked') ? 'S' : 'N';
    //RADIO
    let sCancelarTotal = $('#cbCancelarTotal').is(':checked') ? 'S' : 'N';
    let sFaturarTotal = $('#cbFatTotal').is(':checked') ? 'S' : 'N';
    let sFaturarExpedicao = $('#cbFatExpedicao').is(':checked') ? 'S' : 'N';
    //CAMPOS    
    let sNumero = $('#txtNumero').val();
    let sNotaFiscal = $('#txtNotaFiscal').val();
    let sPedCliente = $('#txtPedCliente').val();
    let sCodigo = $('#txtCodigo').val();
    let sCliente = pegaChave('#txtCliente');
    let sDeposito = pegaChave('#txtDeposito');
    let sGrupoProd = pegaChave('#txtGrupoProd');
    let sMarca = pegaChave('#txtMarca');
    let sMotivo = pegaChave('#txtMotivo');
    let sTipoMvto = pegaChave('#txtTipoMvto');
    let sQualidade = pegaChave('#txtQualidade');
    let sEtiqueta = pegaChave('#txtEtiqueta');
    let sBarra = $('#txtBarra').val();
    let sObs = $('#txtObs').val();
    //TOTALIZADORES
    let sValorLiq = $('#txtValorTotalLiq').val()

    let retorno =
      `&EMP_ID=${getCookie('emp_id')}` +
      //CHECKBOX
      `&BAIXAR_ESTOQUE=${sBaixar_estoque}` +
      `&GERAR_RECEBER=${sGerar_receber}` +
      `&IMP_CONFIGURADA=${sImpConfigurada}` +
      `&EXCLUI_RESERVA=${sExcluirReserva}` +
      `&SOMENTE_QTDE_PENDENTE=${sSomenteQtdePendente}` +
      `&VOLTAR_EXPEDICAO=${sVoltaExpedicao}` +
      `&UTILIZA_BARRA=${sUtiliza_barra}` +
      //RADIO
      `&CANCELAR_TOTAL=${sCancelarTotal}` +
      `&FATURAR_TOTAL=${sFaturarTotal}` +
      `&FATURAR_EXPEDICAO=${sFaturarExpedicao}` +
      //CAMPOS
      `&NUMERO=${sNumero}` +
      `&NOTA_FISCAL=${sNotaFiscal}` +
      `&PED_CLIENTE=${sPedCliente}` +
      `&CODIGO=${sCodigo}` +
      `&CODCLI=${sCliente}` +
      `&DEPOSITO=${sDeposito}` +
      `&GRUPO_PRODUTO=${sGrupoProd}` +
      `&MARCA=${sMarca}` +
      `&MOTIVO=${sMotivo}` +
      `&TIPO_MVTO=${sTipoMvto}` +
      `&QUALIDADE=${sQualidade}` +
      `&ETIQUETA=${sEtiqueta}` +
      `&BARRA=${sBarra}`;
    // `&OBS=${sObs}` +
    //TOTALIZADORES
    // `&VALOR_LIQUIDO=${sValorLiq}`;

    return retorno;
  };

  async function gravaCancelamento() {
    try {
      $.LoadingOverlay('show');
      const ListaItensPedido = buscaDadosTabela();
      const params = buscaParams();

      let objeto = { ListaItensPedido };
      let response = await requisicao('POST', `/sisplan/cancelamentopedido/v1/gravar?`, '', `JSON=${JSON.stringify(objeto)}${params}`, 60000);

      if (!response) {
        return;
      };

      if (response.status != 200) {
        let jsonStr = await response.json();
        msgErro(jsonStr.mensagem);
        return;
      }

      toastr.success(
        `Dados gravados com sucesso!`,
        'Confirmação', {
        toastClass: 'alert',
        iconClasses: {
          error: 'alert-error',
          info: 'alert-info',
          success: 'alert-success',
          warning: 'alert-warning'
        },
        positionClass: "toast-top-center",
        progressBar: true,
        timeOut: 3000,
        fadeOut: 1000,
        onHidden() {
          window.location.href = `${BASE_URI}/cancelamento_pedido`;
        }
      }
      ).css({
        "margin-top": "20%",
        "width": "500px",
        "max-width": "500px"
      });

    } catch (error) {
      console.log(error)
    } finally {
      $.LoadingOverlay('hide');
    }
  }

  $('#btnVoltarCancelado').on('click', async function () {
    await msgAlerta(
      'Deseja voltar as quantidades canceladas?',
      async function () {
        await voltarQuantidadeCanc();
      },
      async function () {
        () => { }
      }
    );
  });

  $('#btnGravar').on('click', async function () {
    validacoesGravar();

    if ($('#cbGerarReceber').is(':checked')) {
      $('#modalGeraDuplicatas').modal('show');
    } else {
      await gravaCancelamento();
    }
  });


  function validacoesGravar() {
    if (!$('#txtDeposito').val() && $('#cbBaixarEstoque').is(':checked')) {
      throw msgAlerta('O depósito deve ser informado, verifique!');
    };

    if (!$('#txtMotivo').val()) {
      throw msgAlerta('O motivo deve ser informado, verifique!');
    };

    let qtde = 0;
    $('#tabelaPedido').DataTable().data().toArray().forEach((item, index) => {
      qtde += parseInt($(`#txtCancelar_${index}`).val());
      if (parseInt($(`#txtCancelar_${index}`).val()) > parseInt(item[7])) {
        $(`#txtCancelar_${index}`).focus();
        throw msgAlerta('Quantidade a cancelar maior que o saldo do pedido, impossível continuar.');
      }
    })

    if (qtde === 0) {
      throw msgAlerta('Nenhuma quantidade informada, impossível continuar.');
    }
  };

  //// AQUI COMEÇA AS FUNÇÕES DO MODAL DE GERAR DUPLICATA

  $('#modalGeraDuplicatas').on('shown.bs.modal', async function () {
    $.LoadingOverlay('show')
    try {
      $('#txtClasseGer').autocompleta(1, `JSON={ "tabela":"CLASSE_GER", "camposSelect":[ "CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}`);
      $('#btnClasseGer').pesquisa('#txtClasseGer', 'CODIGO', 'DESCRICAO', `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"CLASSE_GER", "camposSelect":[ "CODIGO", "DESCRICAO"]}`, 'Pesquisa de Classe Gerencial', 'CLASSE_GER');
      $('#btnLimpaClasseGer').on('click', function () {
        $('#txtClasseGer').val('');
      });

      $('#txtHistorico').autocompleta(1, `JSON={ "tabela":"HISTCP", "camposSelect":[ "HISTORICO CHAVE", "DESCRICAO DESCRICAO"], "where": null}`);
      $('#btnHistorico').pesquisa('#txtHistorico', 'HISTORICO', 'DESCRICAO', `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"HISTCP", "camposSelect":[ "HISTORICO", "DESCRICAO"]}`, 'Pesquisa de Histórico', 'HISTCP');
      $('#btnLimpaHistorico').on('click', function () {
        $('#txtHistorico').val('');
      });

      $('#txtBanco').autocompleta(1, `JSON={ "tabela":"CADBAN", "camposSelect":[ "BANCO CHAVE", "NOME_BANCO DESCRICAO"], "where": null}`);
      $('#btnBanco').pesquisa('#txtBanco', 'BANCO', 'NOME_BANCO', `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"CADBAN", "camposSelect":[ "BANCO", "NOME_BANCO"]}`, 'Pesquisa de Banco', 'BANCO');
      $('#btnLimpaBanco').on('click', function () {
        $('#txtBanco').val('');
      });

      $('#txtSituacao').autocompleta(1, `JSON={ "tabela":"TABSIT", "camposSelect":[ "CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}`);
      $('#btnSituacao').pesquisa('#txtSituacao', 'CODIGO', 'DESCRICAO', `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"TABSIT", "camposSelect":[ "CODIGO", "DESCRICAO"]}`, 'Pesquisa de Situação', 'TABSIT');
      $('#btnLimpaSituacao').on('click', function () {
        $('#txtSituacao').val('');
      });

      $('#txtConta').autocompleta(1, `JSON={ "tabela":"CADCONTA", "camposSelect":[ "CONTA CHAVE", "DESCRICAO DESCRICAO"], "where": null}`);
      $('#btnConta').pesquisa('#txtConta', 'CONTA', 'DESCRICAO', `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"CADCONTA", "camposSelect":[ "CONTA", "DESCRICAO"]}`, 'Pesquisa de Conta', 'CADCONTA');
      $('#btnLimpaConta').on('click', function () {
        $('#txtConta').val('');
      });

      if ($('#txtClasseGer').val() == '') {
        const pesquisaClassePadrao = {
          tabela: 'ENTIDADE',
          camposSelect: ['ENTIDADE.CLASSE', 'CLASSE_GER.DESCRICAO'],
          innerJoin: [{ 'tabela': 'CLASSE_GER', 'condicao': 'ENTIDADE.CLASSE = CLASSE_GER.CODIGO' }],
          where: [`ENTIDADE.CODCLI = '${pegaChave('#txtCliente')}'`]
        };

        const jsonClassePadrao = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaClassePadrao));

        if (jsonClassePadrao.length > 0) {
          $('#txtClasseGer').val(`[${jsonClassePadrao[0].CLASSE}] - ${jsonClassePadrao[0].DESCRICAO}`);
        };
      };

      if ($('#txtHistorico').val() == '') {
        const pesquisaHistoricoPadrao = {
          tabela: 'ENTIDADE',
          camposSelect: ['ENTIDADE.HISTORICO', 'HISTCP.DESCRICAO'],
          innerJoin: [{ 'tabela': 'HISTCP', 'condicao': 'HISTCP.HISTORICO = ENTIDADE.HISTORICO' }],
          where: [`ENTIDADE.CODCLI = '${pegaChave('#txtCliente')}'`]
        };

        const jsonHistoricoPadrao = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaHistoricoPadrao));

        if (jsonHistoricoPadrao.length > 0) {
          $('#txtHistorico').val(`[${jsonHistoricoPadrao[0].HISTORICO}] - ${jsonHistoricoPadrao[0].DESCRICAO}`);
        };
      };

      if ($('#txtBanco').val() == '') {
        const pesquisaBancoPadrao = {
          tabela: 'ENTIDADE',
          camposSelect: ['ENTIDADE.BANCO', 'CADBAN.NOME_BANCO'],
          innerJoin: [{ 'tabela': 'CADBAN', 'condicao': 'ENTIDADE.BANCO = CADBAN.BANCO' }],
          where: [`ENTIDADE.CODCLI = '${pegaChave('#txtCliente')}'`]
        };

        const jsonBancoPadrao = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaBancoPadrao));

        if (jsonBancoPadrao.length > 0) {
          $('#txtBanco').val(`[${jsonBancoPadrao[0].BANCO}] - ${jsonBancoPadrao[0].NOME_BANCO}`);
        };
      };

      if ($('#txtSituacao').val() == '') {
        const pesquisaSituacaoPadrao = {
          tabela: 'EMPRESA',
          camposSelect: ['EMPRESA.EMP_SITUACAO', 'TABSIT.DESCRICAO'],
          innerJoin: [{ 'tabela': 'TABSIT', 'condicao': 'EMPRESA.EMP_SITUACAO = TABSIT.CODIGO' }],
          where: [`EMPRESA.EMP_ID = ${getCookie('emp_id')}`]
        };

        const jsonSituacaoPadrao = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaSituacaoPadrao));

        if (jsonSituacaoPadrao.length > 0) {
          $('#txtSituacao').val(`[${jsonSituacaoPadrao[0].EMP_SITUACAO}] - ${jsonSituacaoPadrao[0].DESCRICAO}`)
        }
      };

      const pesquisaCondicaoPagto = {
        tabela: 'PEDIDO',
        camposSelect: ['PGTO'],
        where: [`NUMERO = '${$('#txtNumero').val()}'`]
      };

      const jsonStrCondicaoPagamento = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaCondicaoPagto));

      const infoDatatable = $('#tabelaPedido').DataTable().rows().data().toArray();

      let valorTot = 0;

      infoDatatable.forEach((info, index) => {
        let quantidade = parseInt($(`#txtFaturada_${index}`).val());
        quantidade = isNaN(quantidade) ? 0 : quantidade;
        valorTot += parseFloat(info[5]) * quantidade;
      });

      if (valorTot <= 0) {
        $('#modalGeraDuplicatas').modal('hide')
        msgAlerta('Impossível gerar receber sem quantidades a faturar!')
        return;
      }

      const listaDuplicatas = await geraDuplicatas(jsonStrCondicaoPagamento[0].PGTO, valorTot);

      if ($.fn.DataTable.isDataTable('#tabelaGeraDuplicatas')) {
        $('#tabelaGeraDuplicatas').DataTable().destroy();
        $('#tabelaGeraDuplicatas').empty();
      };

      $('#tabelaGeraDuplicatas').DataTable({
        destroy: true,
        searching: false,
        lengthChange: false,
        scrollX: false,
        order: false,
        ///autoWidth: true,
        data: listaDuplicatas,
        columns: [
          {
            data: "dtVencto",
            title: "Data Vencto"
          },
          {
            data: "vValorDup",
            title: "Valor Duplicata"
          }
        ],
        "columnDefs": [
          {
            "targets": 0,
            "className": "text-left"
          }
        ],
        "columnDefs": [
          {
            "targets": 1,
            "className": "text-right"
          }
        ]
      });
    } finally {
      $.LoadingOverlay('hide')
    }
  });

  function buscaDuplicatas() {
    const arrayDup = []
    let objDup = {}
    let vValorTot = 0
    const dupDataTable = $('#tabelaGeraDuplicatas').DataTable().rows().data().toArray();

    for (let j = 0; j < dupDataTable.length; j++) {
      vValorTot = parseFloat(parseFloat(vValorTot) + parseFloat(dupDataTable[j].vValorDup));
    }

    for (let i = 0; i < dupDataTable.length; i++) {
      objDup.DTVENCTO = formataDataComTraco(dupDataTable[i].dtVencto)
      objDup.VALOR = dupDataTable[i].vValorDup
      objDup.VALORTOT = vValorTot
      objDup.CLASSE = pegaChave('#txtClasseGer')
      objDup.HISTORICO = pegaChave('#txtHistorico')
      objDup.BANCO = pegaChave('#txtBanco')
      objDup.CONTA = pegaChave('#txtConta')
      objDup.SITUACAO = pegaChave('#txtSituacao')
      objDup.EMPDEMO = $('#cbGeraEmpDemo').is(':checked') ? 'S' : 'N'

      arrayDup.push(objDup)
      objDup = {}
    }

    return arrayDup
  }

  $('#btnConfirmaDup').on('click', async function () {
    $.LoadingOverlay('show')
    try {
      try {
        if ($('#txtClasseGer').val() == '') {
          msgAlerta('Classe Gerencial não informada!')
          return;
        }

        if ($('#txtHistorico').val() == '') {
          msgAlerta('Histórico não informado!')
          return;
        }

        if ($('#txtBanco').val() == '') {
          msgAlerta('Banco não informado!')
          return;
        }

        if ($('#txtSituacao').val() == '') {
          msgAlerta('Situação não informada!')
          return;
        }

        if ($('#txtConta').val() == '') {
          msgAlerta('Conta não informada!')
          return;
        }

        const listaReceberCancelamento = buscaDuplicatas();

        const obj = { listaReceberCancelamento }
        const params = buscaParams();
        const response = await requisicao('POST', `/sisplan/cancelamentopedido/v1/gravarduplicatas?`, '', `JSON=${JSON.stringify(obj)}${params}`, 60000);

        if (!response) {
          msgAlerta('Ocorreu um erro ao gravar duplicatas!')
          return;
        };

        if (response.status != 200) {
          const jsonStr = await response.json();
          msgErro(jsonStr.mensagem);
          return;
        }

        $('#modalGeraDuplicatas').modal('hide')
        await gravaCancelamento();

      } catch (error) {
        console.log(error)
      }
    } finally {
      $.LoadingOverlay('hide')
    }
  })

  function formataData(data) {
    const dtVencimento = (data.getDate() < 9 ? '0' + String(data.getDate()) : String(data.getDate())) + '/' + ((data.getMonth() + 1) < 9 ? '0' + String(data.getMonth() + 1) : String(data.getMonth() + 1)) + '/' + String(data.getFullYear());
    return dtVencimento
  };

  async function geraDuplicatas(condicaoPagto, vValor) {
    let nParcelas = condicaoPagto.trim().split(' ').length;
    let listaParcelas = condicaoPagto.trim().split(' ')
    let listaVenctos = [];

    for (let i = 1; i <= nParcelas; i++) {
      let dias = parseInt(listaParcelas[i - 1]);
      let dtVencimento = new Date();
      let valorDup = 0;
      dtVencimento.setDate(dtVencimento.getDate() + dias);

      if (i != nParcelas) {
        valorDup = roundTo((vValor / nParcelas), 2);
      } else {
        valorDup = (vValor - ((nParcelas - 1) * roundTo(vValor / nParcelas, 2)));
      };

      listaVenctos.push({
        dtVencto: formataData(dtVencimento),
        vValorDup: valorDup.toFixed(2)
      });
    };

    return listaVenctos
  };
});