$('#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: '#geral',
      popover: {
        title: 'Cadastro Geral',
        description: 'Clique aqui para abrir a aba de cadastro Geral.',
        position: 'top'
      }
    },
    {
      element: '#DadosGerais',
      popover: {
        title: 'Dados de Cadastro Geral',
        description: 'Esses são os campos que você informará os dados gerais de cadastro.',
        position: 'top'
      }
    },
    {
      element: '#txtCodigo',
      popover: {
        title: 'Campos Obrigatórios',
        description: 'Esse é um campo obrigatório, para identificá-los, você verá um * ao lado do nome.',
        position: 'top'
      }
    },
    {
      element: '#txtDescricao',
      popover: {
        title: 'Campos Obrigatórios',
        description: 'Esse é um campo obrigatório, para identificá-los, você verá um * ao lado do nome.',
        position: 'top'
      }
    },
    {
      element: '#txtTabelaPreco',
      popover: {
        title: 'Campos Obrigatórios',
        description: 'Esse é um campo obrigatório, para identificá-los, você verá um * ao lado do nome.',
        position: 'top'
      }
    },
    {
      element: '#dataIni',
      popover: {
        title: 'Campos Obrigatórios',
        description: 'Esse é um campo obrigatório, para identificá-los, você verá um * ao lado do nome.',
        position: 'top'
      }
    },
    {
      element: '#dataFim',
      popover: {
        title: 'Campos Obrigatórios',
        description: 'Esse é um campo obrigatório, para identificá-los, você verá um * ao lado do nome.',
        position: 'top'
      }
    },
    {
      element: '#divProduto',
      popover: {
        title: 'Incluir Produto',
        description: 'Aqui você pode incluir um produto.',
        position: 'top'
      }
    },
    {
      element: '#tipos',
      popover: {
        title: 'Tipo',
        description: 'Aqui você seleciona o tipo de regra.',
        position: 'top'
      }
    },
    {
      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 () {
  const parametrosSistema = await BuscaParametrosSistema('S');
  const quantidadeCasasDecimaisParametro = parametrosSistema[1] ?? 0;
  const quantidadeCasasDecimaisCampo = (+quantidadeCasasDecimaisParametro) + 2;
  const utilizaTabCorTam = (await CopiaParametro('VENDA', 5) == 1);
  var parametrosVenda = await BuscaParametrosVenda();
  let listaProdutosMassaSelecionados = []
  let listaProdutosFiltrados = [];
  let novosCodigos = [];
  validaParametroRegra();

  $('#txtTabelaPreco').autocompleta(1, `JSON={ "tabela":"regiao", "camposSelect":[ "regiao chave", "descricao"], "where": null}`);
  $('#btnTabelaPreco').pesquisa('#txtTabelaPreco', 'REGIAO', 'DESCRICAO', `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"regiao", "camposSelect":[ "regiao", "descricao"]}`, 'Pesquisa Tabela de Preço', 'regiao');
  $('#btnATabelaPreco').on('click', function () {
    $('#txtTabelaPreco').val('');
    $('#txtTabelaPreco').trigger('blur');
  });

  $('#txtColecao').pesquisa_variosServerside(1, '{ "tabela":"colecao", "camposSelect":[ "CODIGO", "DESCRICAO" ], "where": null}', 'CODIGO', 'DESCRICAO');
  $('#btnColecao').pesquisa_serversideSel('#txtColecao', `{ "tabela":"colecao", "camposSelect":[ "CODIGO", "DESCRICAO"], "where": null}`, 'Pesquisa de Coleção');
  $('#btnAColecao').on('click', function () {
    $('#txtColecao').empty().trigger('change');
  });

  $('#txtSubColecao').pesquisa_variosServerside(1, '{ "tabela":"cadtag", "camposSelect":[ "CODIGO", "DESCRICAO" ], "where": null}', 'CODIGO', 'DESCRICAO');
  $('#btnSubColecao').pesquisa_serversideSel('#txtSubColecao', `{ "tabela":"cadtag", "camposSelect":[ "CODIGO", "DESCRICAO"], "where": null}`, 'Pesquisa de Sub-Coleção');
  $('#btnASubColecao').on('click', function () {
    $('#txtSubColecao').empty().trigger('change');
  });

  $('#txtMarca').pesquisa_variosServerside(1, '{ "tabela":"MARCA", "camposSelect":[ "CODIGO", "DESCRICAO" ], "where": null}', 'CODIGO', 'DESCRICAO');
  $('#btnMarca').pesquisa_serversideSel('#txtMarca', `{ "tabela":"MARCA", "camposSelect":[ "CODIGO", "DESCRICAO"], "where": null}`, 'Pesquisa de Marca');
  $('#btnAMarca').on('click', function () {
    $('#txtMarca').empty().trigger('change');
  });

  $('#txtEtiqueta').pesquisa_variosServerside(1, '{ "tabela":"ETQ_PROD", "camposSelect":[ "CODIGO", "DESCRICAO" ], "where": null}', 'CODIGO', 'DESCRICAO');
  $('#btnEtiqueta').pesquisa_serversideSel('#txtEtiqueta', `{ "tabela":"ETQ_PROD", "camposSelect":[ "CODIGO", "DESCRICAO"], "where": null}`, 'Pesquisa de Etiqueta');
  $('#btnAEtiqueta').on('click', function () {
    $('#txtEtiqueta').empty().trigger('change');
  });

  $('#txtGrupo').pesquisa_variosServerside(1, '{ "tabela":"GRUPO_PA", "camposSelect":[ "CODIGO", "DESCRICAO" ], "where": null}', 'CODIGO', 'DESCRICAO');
  $('#btnGrupo').pesquisa_serversideSel('#txtGrupo', `{ "tabela":"GRUPO_PA", "camposSelect":[ "CODIGO", "DESCRICAO"], "where": null}`, 'Pesquisa de Grupo');
  $('#btnAGrupo').on('click', function () {
    $('#txtGrupo').empty().trigger('change');
  });

  $('#txtLinha').pesquisa_variosServerside(1, '{ "tabela":"TABLIN", "camposSelect":[ "CODIGO", "DESCRICAO" ], "where": null}', 'CODIGO', 'DESCRICAO');
  $('#btnLinha').pesquisa_serversideSel('#txtLinha', `{ "tabela":"TABLIN", "camposSelect":[ "CODIGO", "DESCRICAO"], "where": null}`, 'Pesquisa de Linha');
  $('#btnALinha').on('click', function () {
    $('#txtLinha').empty().trigger('change');
  });

  $('#btnPesquisaProdutoMassa').on('click', function () {
    $('#modalProduto').modal('show');
  });

  componenteFiltro('grupoPA', true, true, 'GrupoMassa');
  componenteFiltro('tipoProduto', true, true, 'TipoProdutoMassa');
  componenteFiltro('modelo', true, true, 'ModeloMassa');
  componenteFiltro('colecao', true, true, 'ColecaoMassa');
  componenteFiltro('marca', true, true, 'MarcaMassa');
  componenteFiltro('linha', true, true, 'LinhaMassa');
  componenteFiltro('etiqueta', true, true, 'EtiquetaMassa');

  $('#checkSelecionarTodos').on('change', function () {
    $('.cbSel').prop('checked', $('#checkSelecionarTodos').prop('checked'));
    $('.cbSel').trigger('change');
  });

  async function retornarFiltros() {
    const grupo = await formataListas($('#txtGrupoMassa').val().toString());
    const tipoProduto = await formataListas($('#txtTipoProdutoMassa').val().toString());
    const modelo = await formataListas($('#txtModeloMassa').val().toString());
    const colecao = await formataListas($('#txtColecaoMassa').val().toString());
    const marca = await formataListas($('#txtMarcaMassa').val().toString());
    const linha = await formataListas($('#txtLinhaMassa').val().toString());
    const etiqueta = await formataListas($('#txtEtiquetaMassa').val().toString());

    let response = '1=1 ';
    if (grupo != '') {
      response += `AND PRODUTO.GRUPO IN (${grupo}) `;
    }
    if (tipoProduto != '') {
      response += `AND PRODUTO.TIPO IN (${tipoProduto}) `;
    }
    if (modelo != '') {
      response += `AND PRODUTO.MODELO IN (${modelo}) `;
    }
    if (colecao != '') {
      response += `AND PRODUTO.COLECAO IN (${colecao}) `;
    }
    if (marca != '') {
      response += `AND PRODUTO.MARCA IN (${marca}) `;
    }
    if (linha != '') {
      response += `AND PRODUTO.LINHA IN (${linha}) `;
    }
    if (etiqueta != '') {
      response += `AND PRODUTO.ETIQUETA IN (${etiqueta}) `;
    }

    return [response];
  }

  $('#btnConfirmarProdutoMassa').on('click', async function () {
    for (let index = 0; index < listaProdutosMassaSelecionados.length; index++) {
      const produto = listaProdutosMassaSelecionados[index];
      const lista = [];
      lista.push(produto);
      await insereValorPesquisaVarios('txtProduto', 'codigo', 'descricao', lista);
    }
    $('#tabelaProdutoMassa').DataTable().clear().draw(false);
    listaProdutosMassaSelecionados = [];
    $('#modalProduto').modal('hide');

  });


  $('#btnConsultarItensMassa').on('click', async function () {
    try {
      try {
        $.LoadingOverlay('show');
        const where = await retornarFiltros();
        const url = `/sisplan/funcoes/v1/pesquisa?`;
        const pesquisa = {
          camposSelect: ['produto.codigo', 'produto.descricao', 'produto.grupo', 'grupo_pa.descricao desc_grupo', 'produto.tipo', 'cad_tipo_prod.descricao desc_tipo',
            'produto.modelo', 'modelo.descricao desc_modelo', 'produto.colecao', 'colecao.descricao desc_colecao', 'produto.marca', 'marca.descricao desc_marca',
            'produto.linha', 'tablin.descricao desc_linha', 'produto.etiqueta', 'etq_prod.descricao desc_etiqueta'],
          tabela: 'produto',
          leftJoin: [{ tabela: 'grupo_pa', condicao: 'grupo_pa.codigo = produto.grupo' },
          { tabela: 'cad_tipo_prod', condicao: 'cad_tipo_prod.codigo = produto.tipo' },
          { tabela: 'modelo', condicao: 'modelo.codigo = produto.modelo' },
          { tabela: 'colecao', condicao: 'colecao.codigo = produto.colecao' },
          { tabela: 'marca', condicao: 'marca.codigo = produto.marca' },
          { tabela: 'tablin', condicao: 'tablin.codigo = produto.linha' },
          { tabela: 'etq_prod', condicao: 'etq_prod.codigo = produto.etiqueta' },
          ],
          where
        };

        const response = await requisicao(
          "GET",
          url,
          `JSON=${JSON.stringify(pesquisa)}`,
          null
        );

        if (!response) {
          throw new Error("Ocorreu um erro ao realizar pesquisa.");
        }

        const jsonStr = await response.json();

        if (response.status != 200) {
          $.LoadingOverlay("hide");
          msgErro(jsonStr.RESULT[0].mensagem);
          return;
        }

        $('#tabelaProdutoMassa').DataTable({
          destroy: true,
          lengthChange: false,
          serverside: false,
          "autoWidth": true,
          scrollY: 'calc(100vh-620px)',
          pageLength: 12,
          scrollX: true,
          scrollCollapse: true,
          paging: true,
          responsive: true,
          fixedColumns: {
            leftColumns: 0
          },
          data: jsonStr.RESULT[0],
          columns: [
            {
              data: 'sel',
              title: 'Sel',
              render(value, _1, _2, { row }) {
                return `<div class="icheck-primary" style="max-width: 20px">
                          <input type="checkbox" ${!!value && 'checked'} id="cbSel_${row}" class="cbSel">
                          <label for="cbSel_${row}"></label>
                        </div>`;
              }
            },
            { title: 'Código', data: 'CODIGO' },
            { title: 'Descrição', data: 'DESCRICAO' },
            { title: 'Tipo', data: 'TIPO' },
            { title: 'Desc. Tipo', data: 'DESC_TIPO' },
            { title: 'Modelo', data: 'MODELO' },
            { title: 'Desc. Modelo', data: 'DESC_MODELO' },
            { title: 'Coleção', data: 'COLECAO' },
            { title: 'Desc. Coleção', data: 'DESC_COLECAO' },
            { title: 'Marca', data: 'MARCA' },
            { title: 'Desc. Marca', data: 'DESC_MARCA' },
            { title: 'Linha', data: 'LINHA' },
            { title: 'Desc. Linha', data: 'DESC_LINHA' },
            { title: 'Etiqueta', data: 'ETIQUETA' },
            { title: 'Desc. Etiqueta', data: 'DESC_ETIQUETA' }
          ],

          // columnDefs: [{
          //   targets: [0],
          //   render(data) {
          //     return retornaBotaoOpcoes(data);
          //   }
          // }]
        });

        eventoSelecionar();

        $('#tabelaProdutoMassa').on('draw.dt', function () {
          eventoSelecionar();
          const dados = $('#tabelaProdutoMassa').dataTable().api().rows().data().toArray();
          if (listaProdutosMassaSelecionados.length > 0) {
            for (let j = 0; j < listaProdutosMassaSelecionados.length; j++) {
              for (let i = 0; i < dados.length; i++) {
                if (listaProdutosMassaSelecionados[j].CODIGO == dados[i].CODIGO) {
                  $($(".cbSel")[i]).prop('checked', true);
                }
              }
            }
          }
        });


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

  function eventoSelecionar() {
    $('.cbSel').unbind('change');
    $('.cbSel').on('change', function () {
      const ativo = $(this).prop('checked');
      const indice = $(this).attr('id').split('_')[1];
      const dados = $('#tabelaProdutoMassa').DataTable().data().toArray();
      const dado = dados[indice];
      if (ativo) {
        listaProdutosMassaSelecionados.push({ codigo: dado.CODIGO, descricao: dado.DESCRICAO });
      } else {
        listaProdutosMassaSelecionados = listaProdutosMassaSelecionados.filter(it => it.codigo != dado.CODIGO);
      }
    });
  }

  if (utilizaTabCorTam) {
    let tipoBanco = await retornaDatabase();
    $('#txtProduto').pesquisa_variosServerside(1, '{ "tabela":"PRODUTO", "camposSelect":[ "CODIGO", "DESCRICAO" ], "where": ["1=2"]}', 'CODIGO', 'DESCRICAO');
    const pesquisaServerSideSel = {
      tabela: "PRECO_COR_TAM",
      camposSelect: [tipoBanco == 'FIREBIRD' || tipoBanco == 'ORACLE' ? "PRECO_COR_TAM.CODIGO || '-' || PRECO_COR_TAM.COR || '-' || PRECO_COR_TAM.TAM CODIGOUNICO" : "concat(PRECO_COR_TAM.CODIGO, '-', PRECO_COR_TAM.COR, '-', PRECO_COR_TAM.TAM) CODIGOUNICO", "PRODUTO.DESCRICAO DESCRICAO", "PRECO_COR_TAM.CODIGO CODIGO", "PRECO_COR_TAM.COR COR", "CADCOR.DESCRICAO DESCCOR", "PRECO_COR_TAM.TAM TAM", "PRECO_COR_TAM.PRECO PRECO"],
      camposSelectSubSelect: ["CODIGOUNICO", "DESCRICAO", "CODIGO", "COR", "DESCCOR", "TAM", "PRECO"],
      innerJoin: [
        { tabela: "PRODUTO", condicao: "PRECO_COR_TAM.CODIGO = PRODUTO.CODIGO" },
      ],
      leftjoin: [
        { tabela: "CADCOR", condicao: "PRECO_COR_TAM.COR = CADCOR.COR" },
      ],
      groupBy: ["PRECO_COR_TAM.CODIGO", "PRODUTO.DESCRICAO", "PRECO_COR_TAM.COR", "CADCOR.DESCRICAO", "PRECO_COR_TAM.TAM", "PRECO_COR_TAM.PRECO"],
      groupBySubSelect: ["CODIGO", "DESCRICAO", "COR", "DESCCOR", "TAM", "PRECO", "CODIGOUNICO"],
      camposWhereServerSide: ["PRECO_COR_TAM.CODIGO", "PRODUTO.DESCRICAO", "PRECO_COR_TAM.COR", "CADCOR.DESCRICAO", "PRECO_COR_TAM.TAM", "PRECO_COR_TAM.PRECO"]
    };
    $('#btnProduto').pesquisa_serversideSel('#txtProduto', `${JSON.stringify(pesquisaServerSideSel)}`, 'Pesquisa de Produto', undefined);
    $('#btnAProduto').on('click', function () {
      $('#txtProduto').empty().trigger('change');
    });
  } else {
    $('#txtProduto').pesquisa_variosServerside(1, '{ "tabela":"PRODUTO", "camposSelect":[ "CODIGO", "DESCRICAO" ], "where": null}', 'CODIGO', 'DESCRICAO');
    $('#btnProduto').pesquisa_serversideSel('#txtProduto', `{ "tabela":"PRODUTO", "camposSelect":[ "CODIGO", "DESCRICAO", "MARCA", "GRUPO", "ETIQUETA"], "where": null}`, 'Pesquisa de Produto');
    $('#btnAProduto').on('click', function () {
      $('#txtProduto').empty().trigger('change');
    });
  }

  $('.select2-selection__rendered').css('max-width', $($('#txtProduto', 'txtColecao', 'txtSubColecao', 'txtMarca', 'txtEtiqueta', 'txtGrupo', 'txtLinha').parent().children()[1]).css('width'));

  $('#tabela-promo').DataTable({
    paging: false,
    filter: false,
    info: false,
    order: true,
    destroy: true,
    scrollY: '205px',
  });

  $('#tabela-empAcesso').DataTable({
    paging: false,
    filter: false,
    info: false,
    order: true,
    destroy: true,
    scrollY: '180px',
  });

  if (utilizaTabCorTam) {
    $('#tabela-produtos').DataTable({
      paging: false,
      filter: true,
      info: false,
      order: true,
      destroy: true,
      scrollY: '205px',
      "columns": [
        {
          'title': 'CODIGO',
          'data': 'CODIGO'
        },
        {
          'title': 'DESC_PRODUTO',
          'data': 'DESC_PRODUTO'
        },
        {
          'title': 'OPERACAO',
          'data': 'OPERACAO'
        },
        {
          'title': 'COR',
          'data': 'COR'
        },
        {
          'title': 'TAM',
          'data': 'TAM'
        },
        {
          'title': 'PRECO',
          'data': 'PRECO'
        },
        {
          'title': 'VALOR',
          'data': 'VALOR'
        },
        {
          'title': 'EXCLUIR',
          'data': 'EXCLUIR'
        }
      ]
    });
  } else {
    $('#tabela-produtos').DataTable({
      paging: false,
      filter: true,
      info: false,
      order: true,
      destroy: true,
      scrollY: '205px',
      "columns": [
        {
          'title': 'CODIGO',
          'data': 'CODIGO'
        },
        {
          'title': 'DESC_PRODUTO',
          'data': 'DESC_PRODUTO'
        },
        {
          'title': 'OPERACAO',
          'data': 'OPERACAO'
        },
        {
          'title': 'PRECO_00',
          'data': 'PRECO_00'
        },
        {
          'title': 'VALOR',
          'data': 'VALOR'
        },
        {
          'title': 'EXCLUIR',
          'data': 'EXCLUIR'
        }
      ]
    });
  }

  $("#txtPrecoProduto").maskMoney({
    decimal: ".",
    thousands: "",
    precision: 2,
  });

  $("#txtValorAdd").maskMoney({
    decimal: ".",
    thousands: "",
    precision: 2,
  });

  $("#txtValorPromo").maskMoney({
    decimal: ".",
    thousands: "",
    precision: 2,
  });

  $("#txtDescontoPromo").maskMoney({
    decimal: ".",
    thousands: "",
    precision: 2,
  });

  await preencheEmpresas();

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

  $('#tabela-empAcesso').on('click', 'td', function () {
    selecionarLinhaTabela('#tabela-empAcesso', 'checkEmpresa', this);
  });

  $('#btnVoltar').on('click', async function () {
    window.location.href = `${BASE_URI}/regrapromocao`;
  });

  $("#checkDescPromo, #checkValorPromo").on("change", function () {
    $("#txtValorAdd").val("");
    $("#txtValorAdd").maskMoney('destroy');
    $("#txtValorAdd").maskMoney({
      decimal: ".",
      thousands: "",
      precision: 2,
    });
  })

  $('#msform').validate({
    debug: false,
    ignore: "",
    rules: {
      txtDescricao: { required: true, },
      txtTabelaPreco: { required: true, },
      dataIni: { required: true, },
      dataFim: { required: true, },
    },
    messages: {
      txtDescricao: { required: 'Descrição inválida.', },
      txtTabelaPreco: { required: 'Tabela de preço inválida.', },
      dataIni: { required: 'Data inicial inválida.', },
      dataFim: { required: 'Data final inválida.', },
    },
    errorElement: 'span',
    errorPlacement(error, element) {
      error.addClass('invalid-feedback');
      element.closest('.form-group').append(error);
    },
    highlight(element) {
      $(element).addClass('is-invalid');
    },
    unhighlight(element) {
      $(element).removeClass('is-invalid');
    },

    // Gravar
    async submitHandler(form, event) {
      event.preventDefault();
      try {
        $.LoadingOverlay("show");
        if ($('#tabela-produtos').DataTable().rows().count() == 0) {
          msgAlerta('Favor incluir ao menos um produto a regra.');
          return;
        };
        if ($('#tabela-promo').DataTable().rows().count() == 0) {
          msgAlerta('Favor incluir ao menos uma promoção a regra.');
          return;
        };

        const codigo = regra == 'create' ? await RetornaProximo('REGRA_PROMOCAO', 'REGRA_PROMOCAO', 'REGRA', 4) : regra;

        let empresas = [];
        for (let i = 0; i < $('#tabela-empAcesso').DataTable().rows('.selected').data().length; i++) {
          let dados = $('#tabela-empAcesso').DataTable().rows('.selected').data()[i];
          empresas.push(dados[1].split(' - ')[0]);
        };

        if (empresas == '' || empresas == null) {
          msgAlerta('Selecione ao menos uma empresa.');
          return
        }

        let arrRegras = [];
        for (let i = 0; i < $('#tabela-promo').DataTable().rows().count(); i++) {
          arrRegras.push({
            VALOR: $('#tabela-promo').DataTable().rows(i).data()[0][1],
            DESCONTO: $('#tabela-promo').DataTable().rows(i).data()[0][2],
            CAMPO: '',
            CHAVE: '',
            OPERACAO: $('#tabela-promo').DataTable().rows(i).data()[0][3]
          });
        };

        let arrProdutos = [];
        if (utilizaTabCorTam) {
          arrProdutos = $('#tabela-produtos').DataTable().rows().data().toArray()
          // arrProdutos.push({
          //   CODIGO: $('#tabela-produtos').DataTable().rows(i).data()[0].CODIGO,
          //   TIPO: 'P',
          //   OPERACAO: $('#tabela-produtos').DataTable().rows(i).data()[0].OPERACAO,
          //   COR: $('#tabela-produtos').DataTable().rows(i).data()[0].COR,
          //   TAM: $('#tabela-produtos').DataTable().rows(i).data()[0].TAM,
          //   VALOR: Number($('#tabela-produtos').DataTable().rows(i).data()[0].VALOR)
          // });
        } else {
          for (let i = 0; i < $('#tabela-produtos').DataTable().rows().count(); i++) {
            arrProdutos.push({
              CODIGO: $('#tabela-produtos').DataTable().rows(i).data()[0].CODIGO,
              TIPO: 'P',
              OPERACAO: $('#tabela-produtos').DataTable().rows(i).data()[0].OPERACAO,
              VALOR: Number($('#tabela-produtos').DataTable().rows(i).data()[0].VALOR)
            });
          }
        };

        const objRegra = {
          CODREGRA: Number(codigo),
          DESC_REGRA: $('#txtDescricao').val(),
          REGIAO: pegaChave('#txtTabelaPreco'),
          DT_INICIAL: `${$("#dataIni").val()}T00:00:00Z`,
          DT_FINAL: `${$("#dataFim").val()}T00:00:00Z`,
          TIPO: $('#checkValorTabela').prop('checked') ? 'V' : 'Q',
          MODELO: utilizaTabCorTam ? 3 : 1,
          EMPRESA: empresas,
          REGRA: arrRegras,
          ITENS: arrProdutos,
          CODIGOS_NOVOS: novosCodigos
        };

        try {
          let objRegraNovo = objRegra
          //FOI CRIADO ESSE NOVO OBJ PARA REDUZIR A QUANTIDADE DE CÓDIGOS QUE O SQL IRÁ UTILIZAR NO IN LÁ NO BACKEND. 
          if (novosCodigos.length > 0) {
            objRegraNovo.CODIGOS_NOVOS = uniqueByCodigo(objRegra.CODIGOS_NOVOS)
            const validacaoItens = await validacaoItensRegraPromocao(objRegraNovo);

            if (validacaoItens.indexOf("REGRA:") != -1) {
              await mensagemValidacaoItensRegraPromocao(validacaoItens);
            }
          }

          const response = await requisicao('POST', '/sisplan/cadastros/v1/regrapromocao?', '', `JSON=${JSON.stringify(objRegraNovo)}`, 5000000);

          if (!response) {
            return;
          };

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

          toastr.success(
            `Cadastro efetuado com sucesso! Regra: ${codigo}`,
            '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}/regrapromocao`;
            }
          }
          ).css({
            "margin-top": "20%",
            width: "500px",
            "max-width": "500px"
          });
        } catch (error) {
          msgErro(`Não foi possível gravar os dados da regra`);
        }
      } finally {
        $.LoadingOverlay('hide');
      }
    }
  });

  function uniqueByCodigo(arr) {
    const uniqueMap = new Map();

    arr.forEach(item => {
      if (!uniqueMap.has(item.codigo)) {
        uniqueMap.set(item.codigo, item);
      }
    });

    return Array.from(uniqueMap.values());
  }

  $(document).on('mousedown', '.select2-selection__choice__remove', function (e) {
    const $rendered = $(this).closest('.select2-selection__rendered');
    const scrollPos = $rendered.scrollTop();

    // impede o comportamento automático de rolagem
    e.preventDefault();
    e.stopPropagation();

    // deixa o Select2 processar a exclusão
    setTimeout(() => {
      $rendered.scrollTop(scrollPos);
    }, 50);
  });

  $('#txtTabelaPreco').on('blur', async function () {
    $('#btnAProduto').trigger('click');
    if ($(this).val() != '') {
      if (utilizaTabCorTam) {
        let tipoBanco = await retornaDatabase()
        const pesquisaServerSideSelAlterada = {
          tabela: "PRODUTO",
          camposSelect: [tipoBanco == 'FIREBIRD' || tipoBanco == 'ORACLE' ? "PRODUTO.CODIGO || '-' || PRECO_COR_TAM.COR || '-' || PRECO_COR_TAM.TAM CODIGOUNICO" : "concat(PRODUTO.CODIGO, '-', PRECO_COR_TAM.COR, '-', PRECO_COR_TAM.TAM) CODIGOUNICO", "PRODUTO.DESCRICAO DESCRICAO", "PRODUTO.CODIGO CODIGO", "PRECO_COR_TAM.COR COR", "CADCOR.DESCRICAO DESCCOR", "PRECO_COR_TAM.TAM TAM", "PRECO_COR_TAM.PRECO PRECO"],
          camposSelectSubSelect: ["CODIGOUNICO", "DESCRICAO", "CODIGO", "COR", "DESCCOR", "TAM", "PRECO"],
          innerJoin: [
            { tabela: "PRECO_COR_TAM", condicao: "PRECO_COR_TAM.CODIGO = PRODUTO.CODIGO" },
          ],
          leftjoin: [
            { tabela: "CADCOR", condicao: "PRECO_COR_TAM.COR = CADCOR.COR" },
          ],
          where: [`PRECO_COR_TAM.REGIAO = '${pegaChave($(this).val())}'`],
          groupBy: ["PRODUTO.CODIGO", "PRODUTO.DESCRICAO", "PRECO_COR_TAM.COR", "CADCOR.DESCRICAO", "PRECO_COR_TAM.TAM", "PRECO_COR_TAM.PRECO"],
          groupBySubSelect: ["CODIGO", "DESCRICAO", "COR", "DESCCOR", "TAM", "PRECO", "CODIGOUNICO"],
          camposWhereServerSide: ["PRODUTO.CODIGO", "PRODUTO.DESCRICAO", "PRECO_COR_TAM.COR", "CADCOR.DESCRICAO", "PRECO_COR_TAM.TAM", "PRECO_COR_TAM.PRECO"]
        };
        $('#btnProduto').unbind('click');
        $('#btnProduto').pesquisa_serversideSel('#txtProduto', `${JSON.stringify(pesquisaServerSideSelAlterada)}`, 'Pesquisa de Produto', undefined, [5]);
      } else {
        $('#btnProduto').pesquisa_serversideSel('#txtProduto', `{ "tabela":"PRODUTO", "camposSelect":[ "CODIGO", "DESCRICAO", "MARCA", "GRUPO", "ETIQUETA"], "where": null}`, 'Pesquisa de Produto');
      }
    } else {
      if (utilizaTabCorTam) {
        let tipoBanco = await retornaDatabase()
        $('#txtProduto').pesquisa_variosServerside(1, '{ "tabela":"PRODUTO", "camposSelect":[ "CODIGO", "DESCRICAO" ], "where": ["1=2"]}', 'CODIGO', 'DESCRICAO');
        const pesquisaServerSideSel = {
          tabela: "PRODUTO",
          camposSelect: [tipoBanco == 'FIREBIRD' || tipoBanco == 'ORACLE' ? "PRODUTO.CODIGO || '-' || PRECO_COR_TAM.COR || '-' || PRECO_COR_TAM.TAM CODIGOUNICO" : "concat(PRODUTO.CODIGO, '-', PRECO_COR_TAM.COR, '-', PRECO_COR_TAM.TAM) CODIGOUNICO", "PRODUTO.DESCRICAO DESCRICAO", "PRODUTO.CODIGO CODIGO", "PRECO_COR_TAM.COR COR", "CADCOR.DESCRICAO DESCCOR", "PRECO_COR_TAM.TAM TAM", "PRECO_COR_TAM.PRECO PRECO"],
          camposSelectSubSelect: ["CODIGOUNICO", "DESCRICAO", "CODIGO", "COR", "DESCCOR", "TAM", "PRECO"],
          innerJoin: [
            { tabela: "PRECO_COR_TAM", condicao: "PRECO_COR_TAM.CODIGO = PRODUTO.CODIGO" },
          ],
          leftjoin: [
            { tabela: "CADCOR", condicao: "PRECO_COR_TAM.COR = CADCOR.COR" },
          ],
          groupBy: ["PRODUTO.CODIGO", "PRODUTO.DESCRICAO", "PRECO_COR_TAM.COR", "CADCOR.DESCRICAO", "PRECO_COR_TAM.TAM", "PRECO_COR_TAM.PRECO"],
          groupBySubSelect: ["CODIGO", "DESCRICAO", "COR", "DESCCOR", "TAM", "PRECO", "CODIGOUNICO"],
          camposWhereServerSide: ["PRODUTO.CODIGO", "PRODUTO.DESCRICAO", "PRECO_COR_TAM.COR", "CADCOR.DESCRICAO", "PRECO_COR_TAM.TAM", "PRECO_COR_TAM.PRECO"]
        };
        $('#btnProduto').pesquisa_serversideSel('#txtProduto', `${JSON.stringify(pesquisaServerSideSel)}`, 'Pesquisa de Produto', undefined, [5]);
        $('#btnAProduto').on('click', function () {
          $('#txtProduto').empty().trigger('change');
        });
      } else {
        $('#txtProduto').pesquisa_variosServerside(1, '{ "tabela":"PRODUTO", "camposSelect":[ "CODIGO", "DESCRICAO" ], "where": null}', 'CODIGO', 'DESCRICAO');
        $('#btnProduto').pesquisa_serversideSel('#txtProduto', `{ "tabela":"PRODUTO", "camposSelect":[ "CODIGO", "DESCRICAO", "MARCA", "GRUPO", "ETIQUETA"], "where": null}`, 'Pesquisa de Produto');
        $('#btnAProduto').on('click', function () {
          $('#txtProduto').empty().trigger('change');
        });
      }
    }
  });

  if (utilizaTabCorTam) {
    $('#pesquisaModal').on('shown.bs.modal', function () {
      $('#pesquisaModalTable').on('draw.dt', function () {
        const labelPesquisa = $('#pesquisaModalLabel').html();

        if (String(labelPesquisa).toUpperCase() == 'PESQUISA DE PRODUTO') {
          const rows = $('.campoSel_pesquisaModal_btnProduto');

          for (let i = 0; i < rows.length; i++) {
            $(`#${rows[i].id}`).on('click', function () {
              const indiceSelecionado = (this.id).replace('check', '').replace('_pesquisaModal_btnProduto', '');
              const data = $('#pesquisaModalTable').DataTable().data().toArray();
              const rowSelecionada = data[indiceSelecionado];
              const objetoRow = {
                codigo: rowSelecionada[3],
                cor: rowSelecionada[4],
                tam: rowSelecionada[6],
                valor: rowSelecionada[7]
              };

              const index = listaProdutosFiltrados.findIndex(i => i.codigo === objetoRow.codigo && i.cor === objetoRow.cor && i.tam === objetoRow.tam);

              if (index != -1) {
                listaProdutosFiltrados.splice(index, 1);
              } else {
                listaProdutosFiltrados.push(objetoRow);
              }
            });
          };
        };
      });
    });
  };

  const colunasPadrao = {
    true: [
      { title: 'CODIGO', data: 'CODIGO', },
      { title: 'DESC_PRODUTO', data: 'DESC_PRODUTO', },
      { title: 'OPERACAO', data: 'OPERACAO', },
      { title: 'COR', data: 'COR', },
      { title: 'TAM', data: 'TAM', },
      { title: 'PRECO', data: 'PRECO', },
      { title: 'VALOR', data: 'VALOR', },
      { title: 'EXCLUIR', data: 'EXCLUIR', },
    ],
    false: [
      { title: 'CODIGO', data: 'CODIGO', },
      { title: 'DESC_PRODUTO', data: 'DESC_PRODUTO', },
      { title: 'OPERACAO', data: 'OPERACAO', },
      { title: 'PRECO_00', data: 'PRECO_00', },
      { title: 'VALOR', data: 'VALOR', },
      { title: 'EXCLUIR', data: 'EXCLUIR', },
    ]
  }

  if (regra != '' && regra != 'create') {
    try {
      $.LoadingOverlay('show');
      try {
        let dadosRegra = await buscaDadosRegra(regra);

        if (dadosRegra == null) {
          msgAlerta('Regra não encontrada.');
          setTimeout(() => { window.location.href = `${BASE_URI}/regrapromocao`; }, 3000);
        }

        $('#txtCodigo').val(regra);
        $('#txtDescricao').val(dadosRegra[0].DESC_REGRA);
        $('#dataIni').val(dadosRegra[0].DT_INICIAL ? dadosRegra[0].DT_INICIAL.slice(0, 10) : '');
        $('#dataFim').val(dadosRegra[0].DT_FINAL ? dadosRegra[0].DT_FINAL.slice(0, 10) : '');
        insereValor('#txtTabelaPreco', dadosRegra[0].REGIAO, dadosRegra[0].DESCRICAO);

        let empresasRegra = dadosRegra[0].EMPRESA.split(',');
        empresasRegra.map((empRegra) => {
          $('#tabela-empAcesso').DataTable().rows().data().map((empresa, index) => {
            if (empRegra == empresa[1].split(' - ')[0]) {
              $($('.checkEmpresa')[index]).prop('checked', true);
              $($("table#tabela-empAcesso tr")[index + 1]).addClass("selected");
            }
          });
        });

        if (dadosRegra[0].TIPO == 'Q') {
          $('#checkQuantidade').prop('checked', true);
          alteraCheck();
        };

        dadosRegra.map((regra) => {
          adicionaPromocao(
            regra.SEQ,
            regra.VALOR,
            regra.DESCONTO,
            regra.OPERACAO == "" ? ">=" : regra.OPERACAO
          );
        });

        let dadosProdutos = await buscaProdutosRegra(regra);
        if (dadosProdutos == null) {
          msgAlerta('Regra não possui produtos cadastrados.');
          return;
        }

        const posicaoTabela = utilizaTabCorTam ? 7 : 5
        const paging = dadosProdutos.length > 2000;
        $('#tabela-produtos').DataTable({
          paging: paging,
          filter: true,
          scrollY: '205px',
          info: false,
          order: true,
          destroy: true,
          "data": dadosProdutos,
          "columns": colunasPadrao[utilizaTabCorTam],
          columnDefs: [
            {
              targets: [posicaoTabela], render: function (data, type, row) {
                return retornaBotaoOpcoes();
              }
            },
          ]
        });
      } catch (error) {
        console.error(error);
        msgErro('Erro ao retornar os dados da regra.');
      }
    } finally {
      $.LoadingOverlay('hide');
      $('#txtTabelaPreco').trigger('blur')
    }
  }

  $('#btnCarregar').on('click', async function () {
    try {
      $.LoadingOverlay('show');
      if ($('#txtTabelaPreco').val() == '') {
        msgAlerta('Tabela de preço não informada, favor verificar.');
        return;
      }
      $('#tabela-produtos').DataTable().rows().remove().draw(false);
      const considerar = $('#selectConsiderar').val();
      const descricao = $('#txtDescricaoProduto').val();
      const precoAte = $('#txtPrecoProduto').val() != '' ? $('#txtPrecoProduto').val() : '0.00';
      const regiao = pegaChave('#txtTabelaPreco');

      const dados = await retornaProdutos(considerar, descricao, precoAte, regiao);
      if (dados.length == 0) {
        msgAlerta('Nenhum produto encontrado.');
        return;
      }

      let dataSetCols = [];
      let keys = Object.keys(dados[0]);

      keys.forEach(k => {
        dataSetCols.push({
          'title': k,
          'data': k
        });
      });

      dataSetCols.push({
        'title': 'EXCLUIR',
        'data': 'EXCLUIR'
      });

      if (utilizaTabCorTam) {
        dataSetCols[7].render = function () {
          return retornaBotaoOpcoes();
        };
      } else {
        dataSetCols[5].render = function () {
          return retornaBotaoOpcoes();
        };
      }

      $('#tabela-produtos').DataTable({
        paging: false,
        filter: true,
        scrollY: '205px',
        info: false,
        order: true,
        destroy: true,
        "data": dados,
        "columns": dataSetCols
      });

      $('#txtDescricaoProduto').val('');
      $('#txtPrecoProduto').val('0.00');
    } finally {
      $.LoadingOverlay('hide');
    }
  });

  $('#btnIncluirPromo').on('click', async function () {
    adicionaPromocao(
      $('#tabela-promo').DataTable().rows().count() + 1,
      $('#txtValorPromo').val() != '' ? $('#txtValorPromo').val() : '0.00',
      $('#txtDescontoPromo').val() != '' ? $('#txtDescontoPromo').val() : '0.00',
      $("#selectOperacao").val()
    );

    $('#txtValorPromo').val('0.00');
    $('#txtDescontoPromo').val('0.00');
  });

  $('#btnRemover').on('click', async function () {
    try {
      $.LoadingOverlay('show');

      $('#tabela-produtos').DataTable().rows().remove().draw(false);

    } finally {
      $.LoadingOverlay('hide');
    }
  });

  $('#btnIncluir').on('click', async function () {
    try {
      $.LoadingOverlay('show');
      if ($('#txtTabelaPreco').val() == '') {
        msgAlerta('Favor adicionar uma tabela de preço.');
        return;
      }

      if (utilizaTabCorTam) {
        if ((await formataListas($('#txtColecao').val().toString()) == '') &&
          (await formataListas($('#txtSubColecao').val().toString()) == '') &&
          (await formataListas($('#txtMarca').val().toString()) == '') &&
          (await formataListas($('#txtEtiqueta').val().toString()) == '') &&
          (await formataListas($('#txtGrupo ').val().toString()) == '') &&
          (await formataListas($('#txtLinha').val().toString()) == '')) {
          const listaProduto = listaProdutosFiltrados;
          await validaPrecoProduto(listaProduto);
          listaProdutosFiltrados = [];

          for (let i = 0; i < listaProduto.length; i++) {
            const dados = $('#tabela-produtos').DataTable().rows().data().toArray();
            const codigo = listaProduto[i].codigo;
            const cor = listaProduto[i].cor;
            const tam = listaProduto[i].tam;
            const indice = dados.findIndex((item) => item.CODIGO == codigo && item.COR == cor && item.TAM == tam);
            if (indice != -1) {
              msgAlerta(`Produto de código ${dados[indice].CODIGO} já incluso na regra, impossível continuar!`);
              return;
            }
          }

          for (let i = 0; i < listaProduto.length; i++) {
            const produto = listaProduto[i];
            const codigoProduto = produto.codigo;
            const corProduto = produto.cor;
            const tamProduto = produto.tam;
            const descricao = await retornaJsonPesquisaPadrao(`{"tabela": "PRODUTO", "camposSelect": ["DESCRICAO"], "where": ["CODIGO = '${codigoProduto}'"]}`);
            const preco = await retornaPrecoProduto(codigoProduto, pegaChave('#txtTabelaPreco'), corProduto, tamProduto);
            adicionaProduto(
              codigoProduto,
              descricao[0].DESCRICAO,
              preco,
              corProduto,
              tamProduto
            );
          }
        } else {
          const colecao = await formataListas($('#txtColecao').val().toString())
          const subColecao = await formataListas($('#txtSubColecao').val().toString())
          const marca = await formataListas($('#txtMarca').val().toString())
          const etiqueta = await formataListas($('#txtEtiqueta').val().toString())
          const grupo = await formataListas($('#txtGrupo').val().toString())
          const linha = await formataListas($('#txtLinha').val().toString())
          const regiao = pegaChave('#txtTabelaPreco');

          const filtros = `COLECAO=${colecao}` +
            `&SUB_COLECAO=${subColecao}` +
            `&MARCA=${marca}` +
            `&ETIQUETA=${etiqueta}` +
            `&GRUPO=${grupo}` +
            `&LINHA=${linha}` +
            `&OPERACAO=${$('#checkDescPromo').is(':checked') ? 'D' : 'V'}` +
            `&VALOR=${$('#txtValorAdd').val() != '' ? $('#txtValorAdd').val() : '0.00'}` +
            `&REGIAO=${regiao}`;

          let response = await requisicao("GET", `/sisplan/regrapromocao/v1/montatabela?`, filtros);

          if (!response) {
            return;
          }

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

          for (let i = 0; i < json.length; i++) {
            novosCodigos.push({ codigo: json[i].CODIGO, cor: json[i].COR, tam: json[i].TAM })
          }

          if ($.fn.DataTable.isDataTable('#tabela-produtos')) {
            $('#tabela-produtos').DataTable().destroy();
            $('#tabela-produtos').empty();
          };

          let paging = json.length > 2000;
          const colunas = [
            { title: 'CODIGO', data: 'CODIGO', },
            { title: 'DESC_PRODUTO', data: 'DESC_PRODUTO', },
            { title: 'OPERACAO', data: 'OPERACAO', },
            { title: 'COR', data: 'COR', },
            { title: 'TAM', data: 'TAM', },
            { title: 'PRECO', data: 'PRECO', },
            { title: 'VALOR', data: 'VALOR', },
            { title: 'EXCLUIR', data: 'EXCLUIR', },
          ];

          $('#tabela-produtos').DataTable({
            paging: paging,
            filter: true,
            scrollY: '205px',
            info: false,
            order: true,
            destroy: true,
            "data": json,
            "columns": colunas,
            autoWidth: true,
            columnDefs: [
              {
                targets: [7], render: function (data, type, row) {
                  return retornaBotaoOpcoes();
                }
              },
            ]
          });
        }
      } else {
        if ((await formataListas($('#txtColecao').val().toString()) == '') &&
          (await formataListas($('#txtMarca').val().toString()) == '') &&
          (await formataListas($('#txtEtiqueta').val().toString()) == '') &&
          (await formataListas($('#txtGrupo').val().toString()) == '') &&
          (await formataListas($('#txtMarca').val().toString()) == '') &&
          (await formataListas($('#txtLinha').val().toString()) == '')) {
          await validaPrecoProduto();
          const listaProduto = $('#txtProduto').val();

          for (let i = 0; i < listaProduto.length; i++) {
            const dados = $('#tabela-produtos').DataTable().rows().data().toArray();
            const codigo = listaProduto[i];
            const indice = dados.findIndex((item) => item.CODIGO == codigo);
            if (indice != -1) {
              msgAlerta(`Produto de código ${dados[indice].CODIGO} já incluso na regra, impossível continuar!`);
              return;
            }
          }

          for (let i = 0; i < listaProduto.length; i++) {
            let produto = listaProduto[i];
            let descricao = await retornaJsonPesquisaPadrao(`{"tabela": "PRODUTO", "camposSelect": ["DESCRICAO"], "where": ["CODIGO = '${listaProduto[i]}'"]}`);
            let preco = await retornaPrecoProduto(listaProduto[i], pegaChave('#txtTabelaPreco'));
            adicionaProduto(
              produto,
              descricao[0].DESCRICAO,
              preco
            );
          }
        } else {
          const colecao = await formataListas($('#txtColecao').val().toString()) != '' ? ` AND COLECAO IN (${await formataListas($('#txtColecao').val().toString())})` : '';
          const subColecao = await formataListas($('#txtSubColecao').val().toString()) != '' ? ` AND CODTAG IN (${await formataListas($('#txtSubColecao').val().toString())})` : '';
          const marca = await formataListas($('#txtMarca').val().toString()) != '' ? ` AND MARCA IN (${await formataListas($('#txtMarca').val().toString())})` : '';
          const etiqueta = await formataListas($('#txtEtiqueta').val().toString()) != '' ? ` AND ETIQUETA IN (${await formataListas($('#txtEtiqueta').val().toString())})` : '';
          const grupo = await formataListas($('#txtGrupo').val().toString()) != '' ? ` AND GRUPO IN (${await formataListas($('#txtGrupo').val().toString())})` : '';
          const linha = await formataListas($('#txtLinha').val().toString()) != '' ? ` AND LINHA IN (${await formataListas($('#txtLinha').val().toString())})` : '';
          const produtos = await retornaJsonPesquisaPadrao(`{"tabela": "PRODUTO", "camposSelect": ["CODIGO, DESCRICAO"], "where": [" 1=1 ${colecao + subColecao + marca + etiqueta + grupo + linha}"]}`);

          if (produtos) {
            for (let i = 0; i < produtos.length; i++) {

              let preco = await retornaPrecoProduto(produtos[i].CODIGO, pegaChave('#txtTabelaPreco'));

              if (preco != null) {
                adicionaProduto(
                  produtos[i].CODIGO,
                  produtos[i].DESCRICAO,
                  preco
                );
              }
            }
          }
        }
      }
    } finally {
      $.LoadingOverlay('hide');
    }
    $('#txtProduto').empty().trigger('change');
    $('#txtColecao').empty().trigger('change');
    $('#txtSubColecao').empty().trigger('change');
    $('#txtMarca').empty().trigger('change');
    $('#txtEtiqueta').empty().trigger('change');
    $('#txtGrupo').empty().trigger('change');
    $('#txtLinha').empty().trigger('change');
    $('#txtValorAdd').val('');
  });

  async function validaPrecoProduto(listaProdutoTabCorTam = []) {
    let listaProduto;

    if (utilizaTabCorTam) {
      listaProduto = listaProdutoTabCorTam;
    } else {
      listaProduto = $('#txtProduto').val();
    };

    const listaProdutoFormatada = [];
    for (let i = 0; i < listaProduto.length; i++) {
      let preco;

      if (utilizaTabCorTam) {
        preco = await retornaPrecoProduto(listaProduto[i].codigo, pegaChave('#txtTabelaPreco'), listaProduto[i].cor, listaProduto[i].tam);
      } else {
        preco = await retornaPrecoProduto(listaProduto[i], pegaChave('#txtTabelaPreco'));
      }
      if (preco != null) {
        listaProdutoFormatada.push(utilizaTabCorTam ? listaProduto[i].codigo : listaProduto[i]);
      }
    }

    if (listaProdutoFormatada.length > 0) {
      $('#txtProduto').val(listaProdutoFormatada).trigger('change');
    } else {
      $('#txtProduto').empty().trigger('change');
    }
    const listaProdutosSemPreco = listaProduto.filter(produtos => !listaProdutoFormatada.includes(utilizaTabCorTam ? produtos.codigo : produtos));

    if (listaProdutosSemPreco.length > 0) {
      msgAlerta(`Produto(s) ${listaProdutosSemPreco.toString()} sem preço cadastrado na tabela de preço ${pegaChave('#txtTabelaPreco')}`)
    }
  };

  $('#checkValorTabela, #checkQuantidade').on('change', function () {
    alteraCheck();
  });

  function alteraCheck() {
    if ($('#checkValorTabela').prop('checked')) {
      $('#htmlValor').html('Valor');
      $('#txtValorPromo').prop('placeholder', 'Valor');
      $("#divOperacao").addClass("d-none");
      $("#selectOperacao").val(">=");
    } else {
      $('#htmlValor').html('Quantidade');
      $('#txtValorPromo').prop('placeholder', 'Quantidade');
      $("#divOperacao").removeClass("d-none");
    }
  }

  async function buscaDadosRegra(regra) {
    try {
      const url = '/Sisplan/Funcoes/v1/pesquisa?';
      const response = await requisicao('GET', url, `JSON={ "tabela":"REGRA_PROMOCAO",
            "camposSelect":["REGRA_PROMOCAO.DESC_REGRA", "REGRA_PROMOCAO.REGIAO", "REGRA_PROMOCAO.DT_INICIAL", "REGRA_PROMOCAO.DT_FINAL", "REGRA_PROMOCAO.EMPRESA",
            "REGRA_PROMOCAO.VALOR", "REGRA_PROMOCAO.DESCONTO", "REGRA_PROMOCAO.TIPO", "REGRA_PROMOCAO.SEQ", "REGRA_PROMOCAO.MODELO", "REGIAO.DESCRICAO", "REGRA_PROMOCAO.OPERACAO"],
            "innerjoin": [{"tabela": "REGIAO", "condicao": "REGRA_PROMOCAO.REGIAO = REGIAO.REGIAO"}],
            "where": ["REGRA = ${regra}"]}`);

      if (!response) {
        return;
      }

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

      if (jsonStr.RESULT[0].length > 0) {
        return jsonStr.RESULT[0];
      }
      return null;


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

  async function buscaProdutosRegra(regra) {
    try {
      const url = '/Sisplan/Funcoes/v1/pesquisa?';

      let innerJoin = '';
      let camposSelect = '';

      if (utilizaTabCorTam) {
        innerJoin = `"innerjoin": [{"tabela": "PRECO_COR_TAM", "condicao": "PRECO_COR_TAM.CODIGO = REGRA_PROMOCAOI.CODIGO AND PRECO_COR_TAM.COR = REGRA_PROMOCAOI.COR AND PRECO_COR_TAM.TAM = REGRA_PROMOCAOI.TAM AND PRECO_COR_TAM.REGIAO = '${pegaChave('#txtTabelaPreco')}'"}, {"tabela": "PRODUTO", "condicao": "REGRA_PROMOCAOI.CODIGO = PRODUTO.CODIGO"}]`;
        camposSelect = `"camposSelect": ["DISTINCT REGRA_PROMOCAOI.CODIGO", "PRODUTO.DESCRICAO DESC_PRODUTO","REGRA_PROMOCAOI.OPERACAO", "REGRA_PROMOCAOI.COR", "REGRA_PROMOCAOI.TAM", "PRECO_COR_TAM.PRECO", "REGRA_PROMOCAOI.VALOR"]`;
      } else {
        innerJoin = `"innerjoin": [{"tabela": "TABPRECO", "condicao": "TABPRECO.CODIGO = REGRA_PROMOCAOI.CODIGO AND TABPRECO.REGIAO = '${pegaChave('#txtTabelaPreco')}'"}]`;
        camposSelect = `"camposSelect": ["DISTINCT REGRA_PROMOCAOI.CODIGO", "TABPRECO.DESC_PRODUTO", "REGRA_PROMOCAOI.OPERACAO", "TABPRECO.PRECO_00", "REGRA_PROMOCAOI.VALOR"]`;
      }

      const response = await requisicao('GET', url, `JSON={ "tabela":"REGRA_PROMOCAOI", ${camposSelect}, ${innerJoin}, "where": ["REGRA_PROMOCAOI.REGRA = ${regra}"]}`, '', 3600000);

      if (!response) {
        return;
      }

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

      if (jsonStr.RESULT[0].length > 0) {
        return jsonStr.RESULT[0];
      }
      return null;


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

  function adicionaProduto(codigo, descricao, preco, cor = '', tam = '') {
    if (utilizaTabCorTam) {
      $('#tabela-produtos').DataTable().row.add({
        CODIGO: codigo,
        DESC_PRODUTO: descricao,
        OPERACAO: $('#checkDescPromo').is(':checked') ? 'D' : 'V',
        COR: cor,
        TAM: tam,
        PRECO: preco,
        VALOR: $('#txtValorAdd').val() != '' ? $('#txtValorAdd').val() : '0.00',
        EXCLUIR: retornaBotaoOpcoes()
      }).draw(false);
      novosCodigos.push({ codigo: codigo, cor: cor, tam: tam })
    } else {
      $('#tabela-produtos').DataTable().row.add({
        CODIGO: codigo,
        DESC_PRODUTO: descricao,
        OPERACAO: $('#checkDescPromo').is(':checked') ? 'D' : 'V',
        PRECO_00: preco,
        VALOR: $('#txtValorAdd').val() != '' ? $('#txtValorAdd').val() : '0.00',
        EXCLUIR: retornaBotaoOpcoes()
      }).draw(false);
      novosCodigos.push({ codigo: codigo })
    }
  };

  function adicionaPromocao(ordem, valor, desconto, operacao) {
    $('#tabela-promo').DataTable().row.add([
      ordem,
      valor,
      desconto,
      operacao,
      retornaBotaoOpcoes()
    ]).draw(false);
  }

  $('#tabela-produtos').on('click', '.btn-excluir', async function () {
    $('#tabela-produtos').DataTable().row($(this).parents('tr')).remove().draw(false);


  });

  $('#tabela-promo').on('click', '.btn-excluir', async function () {
    $('#tabela-promo').DataTable().row($(this).parents('tr')).remove().draw(false);
  });

  async function retornaProdutos(considerar, descricao, precoAte, regiao) {
    try {
      const url = '/Sisplan/Funcoes/v1/pesquisa?';

      let sWhere = '';

      if (utilizaTabCorTam) {
        sWhere = `PRECO_COR_TAM.REGIAO = '${regiao}'`;
        if ((considerar == '1') && (descricao != '')) {
          sWhere += ` AND PRODUTO.DESCRICAO LIKE ('[PERCENTUAL]${descricao}[PERCENTUAL]')`;
        } else if ((considerar == '0') && (descricao != '')) {
          sWhere += ` AND PRODUTO.DESCRICAO NOT LIKE ('[PERCENTUAL]${descricao}[PERCENTUAL]')`;
        }
      } else {
        sWhere = `REGIAO = '${regiao}'`;
        if ((considerar == '1') && (descricao != '')) {
          sWhere += ` AND DESC_PRODUTO LIKE ('[PERCENTUAL]${descricao}[PERCENTUAL]')`;
        } else if ((considerar == '0') && (descricao != '')) {
          sWhere += ` AND DESC_PRODUTO NOT LIKE ('[PERCENTUAL]${descricao}[PERCENTUAL]')`;
        }
      }

      // if (utilizaTabCorTam) {
      //   if (precoAte > 0) {
      //     sWhere += ` AND PRECO_COR_TAM.PRECO <= ${precoAte}`;
      //   }
      // } else {
      //   if (precoAte > 0) {
      //     sWhere += ` AND PRECO_00 <= ${precoAte}`;
      //   }
      // }

      let pesquisa = '';

      if (utilizaTabCorTam) {
        pesquisa = `{"tabela":"PRECO_COR_TAM","camposSelect":["PRECO_COR_TAM.CODIGO", "PRODUTO.DESCRICAO DESC_PRODUTO", "PRECO_COR_TAM.COR", "PRECO_COR_TAM.TAM","PRECO_COR_TAM.PRECO"], "innerJoin": [{ "tabela": "PRODUTO", "condicao": "PRECO_COR_TAM.CODIGO = PRODUTO.CODIGO" }], "where": ["${sWhere}"]}`
      } else {
        pesquisa = `{"tabela":"TABPRECO","camposSelect":["CODIGO", "DESC_PRODUTO", "PRECO_00"],"where": ["${sWhere}"]}`
      }

      const json = encodeURIComponent(pesquisa);

      const response = await requisicao('GET', url, `JSON=${encodeURIComponent(json)}`);

      if (!response) {
        return;
      }

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

      let dados = jsonStr.RESULT[0];
      for (let i = 0; i < dados.length; i++) {
        dados[i].OPERACAO = 'D';
        dados[i].VALOR = precoAte;
      }

      return dados;

    } catch (error) {
      console.error(error);
      msgErro('Erro ao buscar dados do usuário');
    }
  }

  async function retornaPrecoProduto(codigo, regiao, cor = '', tam = '') {
    try {
      const url = '/Sisplan/Funcoes/v1/pesquisa?';

      let pesquisa = '';

      if (utilizaTabCorTam) {
        pesquisa = `JSON={ "tabela": "PRECO_COR_TAM", "camposSelect": ["PRECO"], "where": ["CODIGO = '${codigo}' AND REGIAO = '${regiao}' AND COR = '${cor}' AND TAM = '${tam}'"]}`
      } else {
        pesquisa = `JSON={ "tabela":"TABPRECO","camposSelect":["PRECO_00"],"where": ["CODIGO = '${codigo}' and REGIAO = '${regiao}'"]}`;
      }

      const response = await requisicao('GET', url, pesquisa);

      if (!response) {
        return;
      }

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

      if (jsonStr.RESULT[0].length > 0) {
        return utilizaTabCorTam ? jsonStr.RESULT[0][0].PRECO : jsonStr.RESULT[0][0].PRECO_00;
      }

      return null;

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

  async function buscaEmpresaUsuario(codigo) {
    try {
      const url = '/Sisplan/Funcoes/v1/pesquisa?';
      const response = await requisicao('GET', url, `JSON={ "tabela":"acesso_empresa", "camposSelect":["EMPRESA"], "where": ["USUARIO = '${codigo}'"]}`);

      if (!response) {
        return;
      }

      let jsonStr = await response.json();
      if (response.status != 200) {
        msgErro(jsonStr.mensagem);
        return;
      }
      if (jsonStr.RESULT[0].length > 0) {
        return jsonStr.RESULT[0];
      }
      return '';


    } catch (error) {
      console.error(error);
      msgErro('Erro ao buscar dados da empresa do usuário');
    }
  }

  $('.collapse').on('shown.bs.collapse', function (e) {
    let clicked = $(document).find(`[href='#${$(e.target).attr('id')}']`);

    clicked
      .parent()
      .find(".fa-angle-right")
      .removeClass("fa-angle-right")
      .addClass("fa-angle-down");
  })
    .on('hidden.bs.collapse', function (e) {
      let clicked = $(document).find(`[href='#${$(e.target).attr('id')}']`);

      clicked
        .parent()
        .find(".fa-angle-down")
        .removeClass("fa-angle-down")
        .addClass("fa-angle-right");
    });

  async function preencheEmpresas() {
    try {
      const dadosEmpUsuario = {
        orderBy: ['EMPRESA.EMP_PAT'],
        tabela: 'ACESSO_EMPRESA',
        leftJoin: [{
          tabela: 'EMPRESA',
          condicao: "REPLACE(EMPRESA.EMP_PAT,'_','') = ACESSO_EMPRESA.EMPRESA"
        }],
        camposSelect: [
          'EMPRESA.EMP_ID',
          'ACESSO_EMPRESA.EMPRESA',
          'EMPRESA.EMP_FANTASIA',
          'EMPRESA.EMP_NOME',
          'EMPRESA.EMP_PAT'
        ],
        where: [`ACESSO_EMPRESA.USUARIO = '${getCookie('cod_usuario')}'`]
      };

      const usuarioComAcesso = await retornaJsonPesquisaPadrao(JSON.stringify(dadosEmpUsuario));

      if (usuarioComAcesso?.length > 0) {
        $('#tabela-empAcesso').DataTable().rows().remove().draw(false);
        for (let i = 0; i < usuarioComAcesso.length; i++) {
          const empresa = usuarioComAcesso[i];
          $('#tabela-empAcesso').DataTable().row.add([botaoSelecionarGrid(), `${empresa.EMP_ID} - ${empresa.EMP_NOME} - ${empresa.EMP_PAT}`]).draw(false);
        }
        return
      }

      const dadosSelectTodasEmpresas = {
        tabela: 'EMPRESA',
        camposSelect: [
          'EMP_ID',
          'EMP_NOME',
          "REPLACE(EMP_PAT, '_', '') EMP_PAT"
        ],
        where: null
      };

      const todasEmpresas = await retornaJsonPesquisaPadrao(JSON.stringify(dadosSelectTodasEmpresas));

      if (todasEmpresas?.length > 0) {
        $('#tabela-empAcesso').DataTable().rows().remove().draw(false);
        for (let i = 0; i < todasEmpresas.length; i++) {
          const empresa = todasEmpresas[i];
          $('#tabela-empAcesso').DataTable().row.add([botaoSelecionarGrid(), `${empresa.EMP_ID} - ${empresa.EMP_NOME} - ${empresa.EMP_PAT}`]).draw(false);
        }
        return
      }

    } catch (error) {
      throw new Error('Não foi possível carregar a lista de empresas');
    }
  }

  function botaoSelecionarGrid() {
    return '<div class="form-check icheck-primary">' +
      '<input type="checkbox" class="align-self-center checkEmpresa" value""><label></label>' +
      '</div>';
  };

  function retornaBotaoOpcoes() {
    return '<div class="divBtnOpcoes"> ' +
      '    <button class="botaoOpcoes btn-excluir" type="button"><span class="fas fa-trash-alt" style="color:white"></span></button>  ' +
      '   </div>';
  }

  function validaParametroRegra() {
    if (parametrosVenda[29] == 0) {
      msgAlerta("Parâmetro da regra de promoção não está ativo, verifique!");
    }
  }

  async function validacaoItensRegraPromocao(objRegra) {
    try {
      const response = await requisicao('POST', '/sisplan/regrapromocao/v1/validaitensregrapromocao?', '', `JSON=${JSON.stringify(objRegra)}`, 240000);

      if (!response) {
        throw new Error("Não foi possível validar os itens da regra de promoção.");
      }

      let json = await response.text();
      if (response.status != 200) {
        json = await response.json();
        throw new Error(json.mensagem);
      }

      return json;

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

  async function mensagemValidacaoItensRegraPromocao(codigosRepetidos) {
    if (parametrosVenda[29] == '1') {
      await new Promise((resolve, reject) => {
        msgAlerta(`Os produtos listados abaixo já possuem uma regra de promoção cadastrada que inclui uma tabela de preço, empresa ou datas idênticas às do registro atual.\n\n ${codigosRepetidos}.`,
          () => {
            resolve()
          },
          () => {
            reject()
          },
          () => {
            reject()
          },
          () => {
            reject()
          },
        );
      })
    } else if (parametrosVenda[29] == '2') {
      await new Promise((resolve, reject) => {
        msgAlerta(`Os produtos listados abaixo já possuem uma regra de promoção cadastrada que inclui uma tabela de preço, empresa ou datas idênticas às do registro atual.\n\n ${codigosRepetidos}.`,
          undefined,
          undefined,
          () => {
            reject()
          },
          () => {
            reject()
          },
        )
      })
    } else {
      await new Promise((resolve, reject) => {
        msgAlerta(`Os produtos listados abaixo já possuem uma regra de promoção cadastrada que inclui uma tabela de preço, empresa ou datas idênticas às do registro atual.\n\n ${codigosRepetidos}.`,
          undefined,
          undefined,
          () => {
            resolve()
          },
          () => {
            resolve()
          },
        )
      })
    }
  }

});