$(document).ready(function () { if ($("#formMode").val() == "VIEW") { showAndBlock(["all"]); } else { var activity = $("#activity").val(); var requestDate = getCurrentDate(); $(".activity").hide(); $(".activity-" + activity).show(); // Atividade 4: Abertura if (activity == 4) { $("#dataNec").val(requestDate[0]); // já coloca a data de hoje toggleBotaoAddItem(); // Atividade 6: Validação do Centro de Custo } else if (activity == 5) { showAndBlock([4]); // bloqueia os campos da abertura $("#userValidacaoGestor").val($("#currentUserName").val()); $("#dataValidacaoGestor").val(requestDate[0] + " - " + requestDate[1]); if ($("#justificativaDecisaoGestor").val() == "") { $(".justificativa-activity-4").hide(); } } }}); $(document).ready(function () { try { FLUIGC.calendar('#dataNec'); } catch (e) { console.warn("Erro ao iniciar calendário:", e); } toggleBotaoAddItem(); // inicia escondido /* ========= Eventos ========= */ $('#precoRef, #quantidade').on('input', recalcTotal); $('#qtdMais').on('click', function () { let v = parseInt($('#quantidade').val() || '0', 10); $('#quantidade').val(v + 1); recalcTotal(); }); $('#qtdMenos').on('click', function () { let v = parseInt($('#quantidade').val() || '0', 10); v = Math.max(0, v - 1); $('#quantidade').val(v); recalcTotal(); }); $('#btnBuscaProd').on('click', consultarProdutos); $('#btnLimpaProd').on('click', limparCamposPrincipais); $('#btnAddItem').on('click', adicionarItem); }); function showAndBlock(activity) { for (var i = 0; i < activity.length; i++) { $(".activity-" + activity[i]).show(); $(".hideButton").hide(); $(".activity-" + activity[i] + " :input").each(function () { $(this).attr("readonly", "readonly") .css("background-color", "#eee") .children("option:not(:selected)").prop("disabled", true); if ($(this).is(":checkbox") || $(this).is(":radio")) { $(this).attr("disabled", true); } }); } } function getCurrentDate() { var newDate = new Date(); var h = newDate.getHours(); if (h < 10) { h = "0" + h; } var m = newDate.getMinutes(); if (m < 10) { m = "0" + m; } var hour = h + ":" + m; // + ":" + s; var day = newDate.getDate(); if (day < 10) { day = "0" + day; } var month = newDate.getMonth() + 1; if (month < 10) { month = "0" + month; } newDate = day + "/" + month + "/" + newDate.getFullYear(); var currentDate = [newDate, hour]; return currentDate; } function toggleBotaoAddItem() { const temProduto = $('#produtoCod').val() || $('#DescoProduto').val(); if (temProduto && temProduto.trim() !== "") { $('#btnAddItem').show(); } else { $('#btnAddItem').hide(); } } function setSelectedZoomItem(selectedItem) { if (selectedItem.inputId === "estabelecimento") { // joga o código da filial (cnpj, etc.) $("#filialDesc").val(selectedItem.CNPJ); // supondo que o dataset dsSysCompany devolva o campo CNPJ $("#filialest").val(selectedItem.ESTADO); // supondo que o dataset dsSysCompany devolva o campo ESTADO } if (selectedItem.inputId === "centroCusto") { // joga o nome do gestor $("#gestorCentroCusto").val(selectedItem.gestorCentroCusto); // supondo que o dataset dsCentroCusto devolva o campo GestorCentroCusto } } function removedZoomItem(removedItem) { if (removedItem.inputId === "estabelecimento") { // Quando remover a empresa, limpa os campos relacionados $("#filialDesc").val(''); $("#filialest").val(''); } } /* ========= Config ========= */ const DATASET_PRODUTOS = "dsProd"; // dataset de produtos let todosProdutos = []; let paginaAtual = 1; const itensPorPagina = 10; /* ========= Utils ========= */ function escapeHTML(txt) { return $('
').text(txt == null ? '' : String(txt)).html(); } function brMoneyToFloat(v) { if (!v) return 0; return parseFloat(String(v).replace(/\./g, '').replace(',', '.')) || 0; } function floatToBRL(n) { try { return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(n || 0); } catch (_) { return 'R$ ' + (n || 0).toFixed(2).replace('.', ','); } } /* ========= Modal Consulta Produtos ========= */ function consultarProdutos() { FLUIGC.modal({ title: 'Consulta de Produtos', content: '
' + '' + '
' + '
' + '
', id: 'modalConsultaProdutos', size: 'large', actions: [{ 'label': 'Fechar', 'autoClose': true }] }, function (err) { if (!err) carregaListaProdutos(); }); } function carregaListaProdutos(filtro) { // Só chama o dataset se ainda não carregou nada if (todosProdutos.length === 0) { let dataset = DatasetFactory.getDataset(DATASET_PRODUTOS, null, null, null); todosProdutos = dataset && dataset.values ? dataset.values : []; console.log("Produtos carregados do dataset:", todosProdutos.length); } paginaAtual = 1; renderizaProdutos(filtro); } function filtrarProdutos() { paginaAtual = 1; renderizaProdutos(); } function renderizaProdutos(filtro) { filtro = (filtro || $('#filtroDescricao').val() || '').toLowerCase(); // Agora filtra no cache (sem chamar dataset de novo) const produtosFiltrados = todosProdutos.filter(p => (p.descricao || '').toLowerCase().includes(filtro) || (p.codigo || '').toLowerCase().includes(filtro) || (p.medida || '').toLowerCase().includes(filtro) ); const inicio = (paginaAtual - 1) * itensPorPagina; const fim = inicio + itensPorPagina; const produtosPagina = produtosFiltrados.slice(inicio, fim); let html = ` `; if (produtosPagina.length === 0) { html += ` `; } else { produtosPagina.forEach(produto => { const codigo = escapeHTML(produto['codigo']); const descricao = escapeHTML(produto['descricao']); const um = escapeHTML(produto['medida'] || ''); const preco = produto['ultimoPreco'] || '0,00'; html += ` `; }); } html += `
Codigo Descricao UM Ultimo Preco Acao
Nenhum produto encontrado
${codigo} ${descricao} ${um} ${preco}
`; $('#listaProdutos').html(html); renderizaPaginacao(produtosFiltrados.length); } function renderizaPaginacao(totalItens) { const totalPaginas = Math.ceil(totalItens / itensPorPagina); let html = ''; if (totalPaginas > 1) { if (paginaAtual > 1) { html += ' '; } html += ' Pagina ' + paginaAtual + ' de ' + totalPaginas + ' '; if (paginaAtual < totalPaginas) { html += ''; } } $('#paginacaoProdutos').html(html); } function mudarPagina(n) { paginaAtual = n; renderizaProdutos(); } /* ========= Seleção ========= */ function selecionarProduto(codigo, descricao, preco) { $('#produtoCod').val(codigo); $('#DescoProduto').val(codigo + ' - ' + descricao); $('#ultimoPreco').val(preco); FLUIGC.toast({ title: 'Produto', message: 'Selecionado: ' + descricao, type: 'success' }); $('#modalConsultaProdutos').modal('hide'); toggleBotaoAddItem(); // 👈 mostra botão } /* ========= Eventos delegados ========= */ $(document).on('click', '.selecionar-produto', function () { const codigo = $(this).data('codigo'); const descricao = $(this).data('descricao'); const preco = $(this).data('preco'); selecionarProduto(codigo, descricao, preco); }); // Digitação em Qtd ou Preço Ref → recalcula automaticamente $(document).on('input', 'input[name^="qtd___"], input[name^="Refpreco___"]', function () { recalcLinha(this); }); /* ========= Total / Quantidade ========= */ function recalcTotal() { const q = parseFloat($('#quantidade').val() || '0'); const p = brMoneyToFloat($('#precoRef').val()); const t = (q * p) || 0; $('#total').val(floatToBRL(t)); } /* ========= Index das linhas ========= */ function atualizarIndex() { $('#tbItens tbody tr.tableRow').each(function (i) { if (!$(this).is('[detail=true]')) { $(this).find('.tableIndex').text(i); } }); } /* ========= Totais da tabela ========= */ function atualizarTotais() { let totalItens = 0; let totalGeral = 0; // Pega todos os valores da tabela const dadosTabela = $('#tbItens').find('input').serializeArray(); // Transforma em objeto chave:valor para fácil acesso const mapValores = {}; dadosTabela.forEach(item => { mapValores[item.name] = item.value; }); // Percorre por linha (cada linha tem um sufixo ___1, ___2...) let idx = 1; while (mapValores['qtd___' + idx] !== undefined) { const qtd = parseFloat(mapValores['qtd___' + idx] || 0); const preco = brMoneyToFloat(mapValores['Refpreco___' + idx] || "0"); const total = qtd * preco; totalItens += qtd; totalGeral += total; // Atualiza campo total da linha if ($(`#totalValor___${idx}`).length) { $(`#totalValor___${idx}`).val(floatToBRL(total)); } idx++; } // Atualiza rodapé $('#totalItens').val(totalItens); $('#totalGeral').val(floatToBRL(totalGeral)); } /* ========= Recalcula uma linha ========= */ function recalcLinha(el) { const $linha = $(el).closest('tr'); const qtd = parseFloat($linha.find('input[name^="qtd___"]').val() || '0'); const preco = brMoneyToFloat($linha.find('input[name^="Refpreco___"]').val() || '0'); const total = qtd * preco; $linha.find('input[name^="totalValor___"]').val(floatToBRL(total)); atualizarTotais(); } /* ========= Remover linha ========= */ function fnWdkRemoveChild(el) { $(el).closest('tr').remove(); atualizarIndex(); atualizarTotais(); } /* ========= Adicionar Item ========= */ function adicionarItem() { const cod = $('#produtoCod').val(); const desc = $('#DescoProduto').val(); const ult = $('#ultimoPreco').val() || '0,00'; const qtd = $('#quantidade').val(); const prec = $('#precoRef').val(); const tot = $('#total').val(); const dataN = $('#dataNec').val(); if (!cod) { FLUIGC.toast({ title: 'Atenção', message: 'Selecione um produto/serviço', type: 'warning' }); return; } const idx = wdkAddChild('tbItens'); setTimeout(() => { $('input[name="Codproduto___' + idx + '"]').val(cod); const somenteDesc = desc.includes('-') ? desc.split('-').slice(1).join('-').trim() : desc; $('input[name="produtoDesc___' + idx + '"]').val(somenteDesc); $('input[name="ultimoPrecoItem___' + idx + '"]').val(ult); $('input[name="qtd___' + idx + '"]').val(qtd).on('input', function () { recalcLinha(this); }); $('input[name="Refpreco___' + idx + '"]').val(prec).on('input', function () { recalcLinha(this); }); $('input[name="totalValor___' + idx + '"]').val(tot); $('input[name="dataNecItem___' + idx + '"]').val(dataN); atualizarIndex(); atualizarTotais(); }, 0); FLUIGC.toast({ title: 'Item', message: 'Adicionado à lista', type: 'success' }); limparCamposPrincipais(); } /* ========= Limpar campos principais ========= */ function limparCamposPrincipais() { $('#produtoCod, #DescoProduto').val(''); $('#ultimoPreco').val('0,00'); $('#quantidade').val('0'); $('#precoRef').val('0,00'); $('#total').val('R$ 0,00'); $('#fnComprovante').val(''); toggleBotaoAddItem(); // 👈 mostra botão }