Novo git da alteração

This commit is contained in:
2026-03-01 17:27:48 -03:00
parent 8b7a079235
commit 9ec8d6e70b
366 changed files with 50299 additions and 27325 deletions
+468 -176
View File
@@ -1,203 +1,495 @@
// ======== DATASETS (troque aqui se o id for diferente) ========
const DS_EMPRESAS = 'dsSyscompany';
const DS_FILIAIS = 'dsFiliais'; // se o seu for outro, troque aqui
const DS_CC = 'ds_centroCusto';
const DS_PRODUTOS = 'ProdutoTI'; // se o id for "ProdutosTI", troque aqui
// ======== MAPEAMENTO DE CAMPOS (ajuste se seus datasets usam nomes diferentes) ========
// Empresas / Filiais / Centro de Custo
const EMP_FIELDS = { code: 'codigo', desc: 'descricao' };
const FIL_FIELDS = { code: 'codigo', desc: 'descricao' };
const CC_FIELDS = { code: 'codigo', desc: 'descricao' };
// Produtos (inclui alternativas típicas do Protheus)
const PROD_FIELDS = {
code: ['codigo','B1_COD','CODIGO'],
desc: ['descricao','B1_DESC','DESCRICAO'],
um: ['um','B1_UM','UM'],
lastPrice: ['ultimoPreco','ULTIMO_PRECO','ULT_PRECO','ULTIMOPRECO']
};
// ======== INIT ========
$(document).ready(function () {
FLUIGC.calendar('#dataNec');
try {
FLUIGC.calendar('#dataNec');
} catch (e) {
console.warn("Erro ao iniciar calendário:", e);
}
// qty/preço
$('#precoRef').on('blur', recalcTotal);
$('#quantidade').on('input', recalcTotal);
$('#qtdMais').on('click', () => stepQtd(1));
$('#qtdMenos').on('click', () => stepQtd(-1));
toggleBotaoAddItem(); // inicia escondido
// produto
$('#btnBuscaProd').on('click', openZoomProduto);
$('#btnLimpaProd').on('click', () => {
$('#produtoCod,#produtoDesc').val('');
$('#ultimoPreco').val('0,00');
/* ========= Eventos ========= */
$('#precoRef, #quantidade').on('input', recalcTotal);
$('#qtdMais').on('click', function () {
let v = parseInt($('#quantidade').val() || '0', 10);
$('#quantidade').val(v + 1);
recalcTotal();
});
// zooms
bindZoom($('#empresaDesc'), DS_EMPRESAS, EMP_FIELDS, 'empresaCodigo','empresaDesc');
bindZoom($('#filialDesc'), DS_FILIAIS, FIL_FIELDS, 'filialCodigo','filialDesc');
bindZoom($('#ccDesc'), DS_CC, CC_FIELDS, 'ccCod','ccDesc');
$('#qtdMenos').on('click', function () {
let v = parseInt($('#quantidade').val() || '0', 10);
v = Math.max(0, v - 1);
$('#quantidade').val(v);
recalcTotal();
});
// itens
$('#btnAddItem').on('click', addItem);
$('#btnBuscaProd').on('click', consultarProdutos);
$('#btnLimpaProd').on('click', limparCamposPrincipais);
$('#btnAddItem').on('click', adicionarItem);
});
// ======== HELPERS ========
function stepQtd(n){
const $q = $('#quantidade');
let v = parseInt($q.val()||'0',10)+n;
if (v < 0) v = 0;
$q.val(v);
recalcTotal();
}
$(document).ready(function () {
if ($("#formMode").val() == "VIEW") {
showAndBlock(["all"]);
} else {
//show the right fields
var activity = $("#activity").val();
var requestDate = getCurrentDate();
function parseMoneyBR(s){
if(!s) return 0;
s = (''+s).replace(/[^\d,,-]/g,'').replace(/\./g,'').replace(',', '.');
const v = Number(s);
return isNaN(v) ? 0 : v;
}
function formatMoneyBR(v){
return v.toLocaleString('pt-BR',{style:'currency',currency:'BRL'});
}
function recalcTotal(){
const qtd = parseFloat($('#quantidade').val()||'0');
const preco = parseMoneyBR($('#precoRef').val());
const tot = (qtd * preco) || 0;
$('#total').val(formatMoneyBR(tot));
}
$(".activity").hide();
// Compat: usa filtermodal OU filterModal, dependendo da versão do SG
function openFilterModalCompat(opts){
var fn = (FLUIGC && (FLUIGC.filtermodal || FLUIGC.filterModal));
if (!fn) {
FLUIGC.toast({
title: 'Erro: ',
message: 'Plugin de filtro (filtermodal) não está carregado. Verifique os includes do Style Guide.',
type: 'danger'
});
return { onSelected: function(){} };
}
return fn(opts);
}
$(".activity-" + activity).show();
// pega a primeira chave existente no item
function pick(obj, keys){
if (!Array.isArray(keys)) return obj[keys];
for (const k of keys) if (obj[k] !== undefined && obj[k] !== null) return obj[k];
return '';
}
function firstKey(keys){ return Array.isArray(keys) ? keys[0] : keys; }
if (activity == 0 || activity == 1) {
//primeira atividade
//$("#dataAbertura").val(requestDate[0] + " - " + requestDate[1]);
$("#dataAbertura").val(requestDate[0]);
// ======== ZOOMS GENÉRICOS (empresa, filial, centro de custo) ========
function bindZoom($input, datasetId, fieldsMap, hiddenIdFld, displayFld){
const codeK = fieldsMap.code, descK = fieldsMap.desc;
} else if (activity == 4) {
showAndBlock([0]);
$("#userValidacaoGestor").val($("#currentUserName").val());
$("#dataValidacaoGestor").val(
requestDate[0] + " - " + requestDate[1]
);
updt_line();
} else if (activity == 6) {
showAndBlock([0, 4]);
$("#userValidacaoCompras").val($("#currentUserName").val());
$("#dataValidacaoCompras").val(
requestDate[0] + " - " + requestDate[1]
);
$input.on('click', function(){
openFilterModalCompat({
title: 'Selecionar',
size: 'large',
filterFields: codeK + ', ' + descK,
source: {
url: '/api/public/ecm/dataset/search',
contentType: 'application/json',
root: 'content',
limit: 50,
pattern: '',
param: { datasetId: datasetId }
},
columns: [
{ title: 'Código', data: codeK },
{ title: 'Descrição', data: descK }
],
onSelected: function(data){
$('#'+hiddenIdFld).val(data[codeK]);
$('#'+displayFld).val(data[codeK] + ' - ' + data[descK]);
if ($("#justificativaDecisaoGestor").val() == "") {
$(".justificativa-activity-4").hide();
}
});
});
}
updt_line();
// ======== ZOOM DE PRODUTO ========
function openZoomProduto(){
openFilterModalCompat({
title: 'Buscar Produto/Serviço',
size: 'large',
filterFields: firstKey(PROD_FIELDS.code) + ', ' + firstKey(PROD_FIELDS.desc),
source: {
url: '/api/public/ecm/dataset/search',
contentType: 'application/json',
root: 'content',
limit: 50,
param:{ datasetId: DS_PRODUTOS }
},
columns: [
{ title: 'Código', data: firstKey(PROD_FIELDS.code) },
{ title: 'Descrição', data: firstKey(PROD_FIELDS.desc) },
{ title: 'UM', data: firstKey(PROD_FIELDS.um) },
{ title: 'Último Preço', data: firstKey(PROD_FIELDS.lastPrice) }
],
onSelected: function(item){
const cod = pick(item, PROD_FIELDS.code);
const desc = pick(item, PROD_FIELDS.desc);
const ult = pick(item, PROD_FIELDS.lastPrice);
} else if (activity == 57) {
$("#userCotacaoGestor").val($("#currentUserName").val());
$("#dataAprovCompras").val(
requestDate[0] + " - " + requestDate[1]
);
showAndBlock([0, 4, 6]);
$('#produtoCod').val(cod);
$('#produtoDesc').val(cod + ' - ' + desc);
$('#ultimoPreco').val(ult || '0,00');
recalcTotal();
if ($("#justificativaDecisaoGestor").val() == "") {
$(".justificativa-activity-4").hide();
}
if ($("#justificativaDecisaoCompras").val() == "") {
$(".justificativa-activity-6").hide();
}
updt_line();
} else if (activity == 31) {
$("#userRealizacaoCompras").val($("#currentUserName").val());
$("#dataRealizacaoCompras").val(
requestDate[0] + " - " + requestDate[1]
);
showAndBlock([0, 4, 6, 57]);
if ($("#justificativaDecisaoGestor").val() == "") {
$(".justificativa-activity-4").hide();
}
if ($("#justificativaDecisaoCompras").val() == "") {
$(".justificativa-activity-6").hide();
}
updt_line();
} else if (activity == 18) {
if ($("justificativaValidaProblema") != "") {
showAndBlock([0, 4, 6, 24, 57, 31]);
} else {
showAndBlock([0, 4, 6, 31]);
}
$("#userValidacaoItens").val($("#currentUserName").val());
$("#dataValidacaoItens").val(requestDate[0] + " - " + requestDate[1]);
if ($("#justificativaDecisaoGestor").val() == "") {
$(".justificativa-activity-4").hide();
}
if ($("#justificativaDecisaoCompras").val() == "") {
$(".justificativa-activity-6").hide();
}
if ($("#consideracoesCompras").val() == "") {
$(".justificativa-activity-31").hide();
}
$("input[name=validacaoItens]").on("change", function () {
$(".justificativaDecisaoItens").hide();
if (
$("input[name=validacaoItens]:checked").val() == "incorreto" ||
$("input[name=validacaoItens]:checked").val() == "naoEntregue"
) {
$(".justificativaDecisaoItens").show();
}
});
$("input[name=validacaoItens]").trigger("change");
updt_line();
} else if (activity == 24) {
showAndBlock([0, 4, 6, 31, 18]);
if ($("#justificativaDecisaoGestor").val() == "") {
$(".justificativa-activity-4").hide();
}
if ($("#justificativaDecisaoCompras").val() == "") {
$(".justificativa-activity-6").hide();
}
if ($("#consideracoesCompras").val() == "") {
$(".justificativa-activity-31").hide();
}
updt_line();
}
});
}
});
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;
}
// ======== ITENS (tabela filha) ========
function addItem(){
if(!$('#produtoCod').val()){
FLUIGC.toast({title:'Atenção: ', message:'Selecione um produto.', type:'warning'}); return;
}
if(!$('#ccCod').val()){
FLUIGC.toast({title:'Atenção: ', message:'Selecione o centro de custo.', type:'warning'}); return;
}
const qtd = parseFloat($('#quantidade').val()||'0');
if(qtd <= 0){
FLUIGC.toast({title:'Atenção: ', message:'Quantidade deve ser > 0.', type:'warning'}); return;
}
const row = wdkAddChild('tbItens');
$('#produtoCod___'+row).val($('#produtoCod').val());
$('#produtoDesc___'+row).val($('#produtoDesc').val());
$('#ccCod___'+row).val($('#ccCod').val());
$('#ccDesc___'+row).val($('#ccDesc').val());
$('#qtd___'+row).val(qtd);
$('#precoRef___'+row).val($('#precoRef').val());
$('#total___'+row).val($('#total').val());
}
// ======== VALIDAÇÃO (se usar o hook validateForm) ========
function validateForm(form){
var msgs = [];
function req(id, label){ if(!form.getValue(id)) msgs.push('Preencha "'+label+'".'); }
req('tipoSolicitacao','Tipo de Solicitação');
req('produtoCod','Produto/Serviço');
req('quantidade','Quantidade');
req('dataNec','Data da Necessidade');
req('ccCod','Centro de Custo');
if(msgs.length){ throw msgs.join('\n'); }
function toggleBotaoAddItem() {
const temProduto = $('#produtoCod').val() || $('#DescoProduto').val();
if (temProduto && temProduto.trim() !== "") {
$('#btnAddItem').show();
} else {
$('#btnAddItem').hide();
}
}
function setSelectedZoomItem(selectedItem) {
var name_item = selectedItem.inputId;
var ehItem = name_item.indexOf("___") >= 0;
var indice = "";
if (ehItem){
var valores = name_item.split("___");
name_item = valores[0];
indice = valores[1];
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));
}
if (name_item == "estabelecimento")
{ $("#filialDesc").val(selectedItem["CODIGO"]); }
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
}