2025-08-26 14:12:50 -03:00

204 lines
6.5 KiB
JavaScript

// ======== 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');
// qty/preço
$('#precoRef').on('blur', recalcTotal);
$('#quantidade').on('input', recalcTotal);
$('#qtdMais').on('click', () => stepQtd(1));
$('#qtdMenos').on('click', () => stepQtd(-1));
// produto
$('#btnBuscaProd').on('click', openZoomProduto);
$('#btnLimpaProd').on('click', () => {
$('#produtoCod,#produtoDesc').val('');
$('#ultimoPreco').val('0,00');
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');
// itens
$('#btnAddItem').on('click', addItem);
});
// ======== HELPERS ========
function stepQtd(n){
const $q = $('#quantidade');
let v = parseInt($q.val()||'0',10)+n;
if (v < 0) v = 0;
$q.val(v);
recalcTotal();
}
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));
}
// 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);
}
// 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; }
// ======== ZOOMS GENÉRICOS (empresa, filial, centro de custo) ========
function bindZoom($input, datasetId, fieldsMap, hiddenIdFld, displayFld){
const codeK = fieldsMap.code, descK = fieldsMap.desc;
$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]);
}
});
});
}
// ======== 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);
$('#produtoCod').val(cod);
$('#produtoDesc').val(cod + ' - ' + desc);
$('#ultimoPreco').val(ult || '0,00');
recalcTotal();
}
});
}
// ======== 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 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 (name_item == "estabelecimento")
{ $("#filialDesc").val(selectedItem["CODIGO"]); }
}