204 lines
6.5 KiB
JavaScript
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"]); }
|
|
}
|