$(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); // formata o teto de preço só quando o usuário sair do campo $('#precoRef').on('blur', function() { const p = brMoneyToFloat($(this).val()); $(this).val(floatToBRL(p)); 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); }); /* ========= Total / Quantidade ========= */ function recalcTotal() { const q = parseFloat($('#quantidade').val() || '0'); const p = brMoneyToFloat($('#precoRef').val()); const t = (q * p) || 0; $('#total').val(floatToBRL(t)); } function setSelectedZoomItem(selectedItem) { if (selectedItem.inputId === "estabelecimento") { // joga o código da filial (cnpj, etc.) $("#filialdest").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 $("#filialprotheus").val(selectedItem.CODIGO); // supondo que o dataset dsSysCompany devolva o campo CODIGO } if (selectedItem.inputId === "centro_custo") { // joga o código da filial (cnpj, etc.) $("#gestor_cc").val(selectedItem.idGestor); // supondo que o dataset Centro_custo devolva o campo GestorCentroCusto $("#codigocentroCusto").val(selectedItem.codigoCentroCusto); // supondo que o dataset Centro_custo 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(/R\$/g, '') // remove "R$" .replace(/\s/g, '') // remove espaços .replace(/\./g, '') // remove pontos de milhar .replace(',', '.') // troca vírgula por ponto ) || 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['ultimo_preco'] || '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); $('#descProduto').val(codigo + ' - ' + descricao); $('#ultimoPreco').val(preco); FLUIGC.toast({ title: 'Produto', message: 'Selecionado: ' + descricao, type: 'success' }); $('#modalConsultaProdutos').modal('hide'); toggleBotaoAddItem(); // 👈 mostra botão } function toggleBotaoAddItem() { const temProduto = $('#produtoCod').val() || $('#descProduto').val(); if (temProduto && temProduto.trim() !== "") { $('#btnAddItem').show(); } else { $('#btnAddItem').hide(); } } /* ========= Adicionar Item ========= */ function adicionarItem() { const cod = $('#produtoCod').val(); const desc = $('#descProduto').val(); const qtd = $('#quantidade').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="qtd___' + idx + '"]').val(qtd).on('input', function () { recalcLinha(this); }); $('input[name="ultimoPreco___' + idx + '"]').val(prec).on('input', function () { recalcLinha(this); }); atualizarIndex(); atualizarTotais(); }, 0); FLUIGC.toast({ title: 'Item', message: 'Adicionado à lista', type: 'success' }); limparCamposPrincipais(); } /* ========= Limpar campos principais ========= */ function limparCamposPrincipais() { $('#produtoCod, #descProduto').val(''); $('#quantidade').val('0'); $('#precoRef').val('0,00'); $('#fnComprovante').val(''); 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); }); /* ========= Index das linhas ========= */ function atualizarIndex() { $('#tbItens tbody tr.tableRow').each(function (i) { if (!$(this).is('[detail=true]')) { $(this).find('.tableIndex').text(i); } }); } /* ========= Remover linha ========= */ function fnWdkRemoveChild(el) { $(el).closest('tr').remove(); atualizarIndex(); atualizarTotais(); } /* ========= Link do produto ========= */ function handleProductLink(el) { const $row = $(el).closest("tr"); const $hidden = $row.find("input.produto-link"); let linkAtual = $hidden.val(); if (!linkAtual) { // ainda não tem link → pedir ao usuário let novoLink = prompt("Insira o link do produto:"); if (novoLink && novoLink.trim() !== "") { $hidden.val(novoLink.trim()); // grava no hidden (vai persistir no Fluig) } } else { // já existe link → abrir window.open(linkAtual, "_blank"); } } $(function () { var steps = [ { state: 1, label: "Solicitação" }, { state: 121, label: "Validando Necessidade" }, { state: 82, label: "Enviando pedido" }, { state: 114, label: "Cotação Iniciada" }, { state: 105, label: "Indicar Cotação" }, { state: 137, label: "Confirmação da cotação" }, { state: 133, label: "Aprovação Gestor" }, { state: 147, label: "Aprovação Ger. Financeiro" }, { state: 158, label: "Aprovação CEO" }, { state: 18, label: "Recebimento do Produto" }, { state: 24, label: "Problema" }, { state: 52, label: "Fim" } ]; var current = parseInt($("#activity").val() || "0", 10); var idxAtual = steps.findIndex(function (s) { return s.state === current; }); if (idxAtual < 0) idxAtual = 0; $("#wizard-steps .step-item").each(function (i) { if (i < idxAtual) $(this).addClass("done"); if (i === idxAtual) $(this).addClass("active"); }); // clique nos steps $("#wizard-steps .step-item").on("click", function () { var index = $(this).index(); var step = steps[index]; if (!step) return; // 👉 se já estava ativo, mostra tudo de novo if ($(this).hasClass("active") && $(".activity:visible").length === 1) { $(".activity").show(); $("#wizard-steps .step-item").removeClass("active"); return; } // senão, mostra só a activity clicada $(".activity").hide(); $(".activity-" + step.state).show(); $("#wizard-steps .step-item").removeClass("active"); $(this).addClass("active"); }); }); $(document).ready(function () { // Quando carregar a página, já pinta o status se tiver valor nos inputs let status = $("#statusSCProtheus").val() || ""; let badgeClass = "badge bg-secondary"; if (status.toLowerCase().includes("sucesso")) badgeClass = "badge bg-success"; if (status.toLowerCase().includes("erro")) badgeClass = "badge bg-danger"; $("#statusSCProtheus_label") .text(status || "-") .removeClass() .addClass(badgeClass); }); function recalcularTotalCotacao() { var soma = 0; $("input[name^='selecionado___']").each(function() { var idx = $(this).attr("id").split("___")[1]; // pega qtd e preço da linha var qtd = parseFloat($("#qtdc___" + idx).val() || "0"); var preco = parseFloat($("#preco___" + idx).val() || "0"); // calcula total da linha var total = qtd * preco; // atualiza campo total da linha $("#total___" + idx).val(total.toFixed(2)); // se marcado, acumula na soma if ($(this).is(":checked")) { soma += total; } }); // Atualiza o hidden e dispara change pro Fluig gravar $("#valorTotalCotacao").val(soma.toFixed(2)).trigger("change"); } // dispara sempre que marcar/desmarcar $(document).on("change", "input[name^='selecionado___']", function() { recalcularTotalCotacao(); }); // recalcula ao abrir a atividade $(document).ready(function() { recalcularTotalCotacao(); }); // garante que o total seja salvo antes de enviar a atividade function beforeSendValidate(numState, nextState) { console.log("Executando beforeSendValidate, recalculando total..."); recalcularTotalCotacao(); return true; // precisa retornar true senão bloqueia o envio }