425 lines
12 KiB
JavaScript
425 lines
12 KiB
JavaScript
$(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 $('<div>').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:
|
|
'<div id="buscaProduto" style="margin-bottom:10px;">' +
|
|
'<input type="text" id="filtroDescricao" class="form-control" placeholder="Buscar por descrição..." onkeyup="filtrarProdutos()">' +
|
|
'</div>' +
|
|
'<div id="listaProdutos"></div>' +
|
|
'<div id="paginacaoProdutos" style="margin-top:10px; text-align:center;"></div>',
|
|
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 = `
|
|
<table class="table table-striped">
|
|
<thead>
|
|
<tr>
|
|
<th>Codigo</th>
|
|
<th>Descricao</th>
|
|
<th>UM</th>
|
|
<th>Ultimo Preco</th>
|
|
<th>Acao</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
`;
|
|
|
|
if (produtosPagina.length === 0) {
|
|
html += `
|
|
<tr>
|
|
<td colspan="5" class="text-center text-muted">
|
|
Nenhum produto encontrado
|
|
</td>
|
|
</tr>`;
|
|
} 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 += `
|
|
<tr>
|
|
<td>${codigo}</td>
|
|
<td>${descricao}</td>
|
|
<td>${um}</td>
|
|
<td>${preco}</td>
|
|
<td>
|
|
<button class="btn btn-sm btn-success selecionar-produto"
|
|
data-codigo="${codigo}"
|
|
data-descricao="${descricao}"
|
|
data-preco="${preco}">
|
|
Selecionar
|
|
</button>
|
|
</td>
|
|
</tr>`;
|
|
});
|
|
}
|
|
|
|
html += `</tbody></table>`;
|
|
$('#listaProdutos').html(html);
|
|
|
|
renderizaPaginacao(produtosFiltrados.length);
|
|
}
|
|
|
|
|
|
|
|
function renderizaPaginacao(totalItens) {
|
|
const totalPaginas = Math.ceil(totalItens / itensPorPagina);
|
|
let html = '';
|
|
if (totalPaginas > 1) {
|
|
if (paginaAtual > 1) {
|
|
html += '<button class="btn btn-sm btn-default" onclick="mudarPagina(' + (paginaAtual - 1) + ')">Anterior</button> ';
|
|
}
|
|
html += ' Pagina ' + paginaAtual + ' de ' + totalPaginas + ' ';
|
|
if (paginaAtual < totalPaginas) {
|
|
html += '<button class="btn btn-sm btn-default" onclick="mudarPagina(' + (paginaAtual + 1) + ')">Proxima</button>';
|
|
}
|
|
}
|
|
$('#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
|
|
}
|