This commit is contained in:
Andrey Cunha
2026-05-11 21:54:49 -03:00
parent ba5d7dae57
commit a71f963e37
17 changed files with 3091 additions and 4186 deletions
@@ -44,42 +44,73 @@ function recalcTotal() {
}
/* Parse "fieldName___index" IDs used by Fluig Zoom child items */
function parseZoomItemId(rawId) {
const sep = (rawId || "").indexOf("___");
if (sep >= 0) {
return { inputId: rawId.substring(0, sep), indice: rawId.substring(sep + 3) };
}
return { inputId: rawId || "", indice: "" };
}
function setSelectedZoomItem(selectedItem) {
if (selectedItem.inputId === "estabelecimento") {
// dsFiliais: guarda dados da filial e define gestor da próxima atividade
var codigoProtheus = String(selectedItem.PROTHEUS || selectedItem.protheus || "").trim();
const { inputId, indice } = parseZoomItemId(selectedItem.inputId);
if (inputId === "estabelecimento") {
const codigoProtheus = String(selectedItem.PROTHEUS || selectedItem.protheus || "").trim();
const gestorLoja = String(selectedItem.COLLEAGUE_ID || selectedItem.LOGIN_LOJA || "").trim();
$("#filialdest").val(selectedItem.LOJA || "");
$("#filialest").val(selectedItem.UF || "");
$("#filialprotheus").val(codigoProtheus);
$("#centro_custo").val(selectedItem.RESPONSAVEL_LOJA || selectedItem.LOJA || "");
$("#codigocentroCusto").val(codigoProtheus);
var gestorLoja = (selectedItem.COLLEAGUE_ID || selectedItem.LOGIN_LOJA || "").trim();
$("#gestor_cc").val(gestorLoja);
if (!codigoProtheus) {
console.warn("Filial selecionada sem campo PROTHEUS no dsFiliais.");
console.warn("[ZoomHandler] Filial sem PROTHEUS:", selectedItem);
}
}
if (inputId === "centroCusto") {
$("#gestorNome").val(selectedItem.gestorCentroCusto || "");
$("#gestorEmail").val(selectedItem.emailGestor || "");
$("#gestor_cc").val(selectedItem.idGestor || "");
}
}
if (inputId === "userSolicitante") {
$("#emailSolicitante").val(selectedItem.mail || "");
}
function removedZoomItem(removedItem) {
if (removedItem.inputId === "estabelecimento") {
// Quando remover a filial, limpa os campos relacionados
$("#filialdest").val("");
$("#filialest").val("");
$("#filialprotheus").val("");
$("#centro_custo").val("");
$("#codigocentroCusto").val("");
$("#gestor_cc").val("");
if (inputId === "descricao") {
$("#codigoItem___" + indice).val(selectedItem.descricao || "");
}
}
/* ========= Config ========= */
const DATASET_PRODUTOS = "dsComprasProdutos"; // dataset de produtos
function removedZoomItem(removedItem) {
const { inputId, indice } = parseZoomItemId(removedItem.inputId);
if (inputId === "estabelecimento") {
$("#filialdest, #filialest, #filialprotheus, #centro_custo, #codigocentroCusto, #gestor_cc").val("");
}
if (inputId === "centroCusto") {
$("#gestorNome, #gestorEmail, #gestor_cc").val("");
}
if (inputId === "userSolicitante") {
$("#emailSolicitante").val("");
}
if (inputId === "descricao") {
$("#codigoItem___" + indice + ", #quantidadeItem___" + indice).val("");
}
}
/* ========= Config (centralizada em compras_config.js) ========= */
const DATASET_PRODUTOS = (typeof ComprasConfig !== "undefined")
? ComprasConfig.datasets.produtos
: "dsComprasProdutos";
let todosProdutos = [];
let paginaAtual = 1;
const itensPorPagina = 10;
@@ -266,9 +297,9 @@ function toggleBotaoAddItem() {
}
/* ========= Adicionar Item ========= */
function adicionarItem() {
const cod = $('#produtoCod').val();
const cod = $('#produtoCod').val();
const desc = $('#descProduto').val();
const qtd = $('#quantidade').val();
const qtd = $('#quantidade').val() || '1';
if (!cod) {
FLUIGC.toast({ title: 'Atenção', message: 'Selecione um produto/serviço', type: 'warning' });
@@ -277,20 +308,17 @@ function adicionarItem() {
const idx = wdkAddChild('tbItens');
setTimeout(() => {
setTimeout(function () {
$('input[name="Codproduto___' + idx + '"]').val(cod);
const somenteDesc = desc.includes('-') ? desc.split('-').slice(1).join('-').trim() : desc;
const somenteDesc = desc.indexOf('-') >= 0 ? 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); });
$('input[name="qtd___' + idx + '"]').val(qtd);
atualizarIndex();
atualizarTotais();
}, 0);
FLUIGC.toast({ title: 'Item', message: 'Adicionado à lista', type: 'success' });
limparCamposPrincipais();
}
@@ -380,16 +408,16 @@ $(function () {
var step = steps[index];
if (!step) return;
// 👉 se já estava ativo, mostra tudo de novo
// se já estava ativo, mostra tudo de novo
if ($(this).hasClass("active") && $(".activity:visible").length === 1) {
$(".activity").show();
$(".activity").css("display", "block");
$("#wizard-steps .step-item").removeClass("active");
return;
}
// senão, mostra só a activity clicada
$(".activity").hide();
$(".activity-" + step.state).show();
$(".activity").css("display", "none");
$(".activity-" + step.state).css("display", "block");
$("#wizard-steps .step-item").removeClass("active");
$(this).addClass("active");
@@ -408,30 +436,32 @@ function setLabel(id, valor) {
function badgeClassByStatus(status) {
var s = String(status || "").toLowerCase();
if (!s) return "badge bg-secondary";
if (s.indexOf("erro") >= 0 || s.indexOf("reprov") >= 0 || s.indexOf("cancel") >= 0) return "badge bg-danger";
if (s.indexOf("aguard") >= 0 || s.indexOf("pend") >= 0) return "badge bg-warning";
if (s.indexOf("sucesso") >= 0 || s.indexOf("aprov") >= 0 || s.indexOf("gerad") >= 0 || s.indexOf("liberad") >= 0) return "badge bg-success";
if (s.indexOf("bloque") >= 0 || s.indexOf("rejeit") >= 0) return "badge bg-danger";
return "badge bg-info";
if (!s || s === "sem cotacao" || s === "sem pedido" || s === "-") return "badge-status badge-waiting";
if (s.indexOf("erro") >= 0 || s.indexOf("reprov") >= 0 || s.indexOf("cancel") >= 0) return "badge-status badge-rejected";
if (s.indexOf("bloque") >= 0 || s.indexOf("rejeit") >= 0) return "badge-status badge-blocked";
if (s.indexOf("aguard") >= 0 || s.indexOf("pend") >= 0) return "badge-status badge-pending";
if (s.indexOf("sucesso") >= 0 || s.indexOf("aprov") >= 0 || s.indexOf("gerad") >= 0 || s.indexOf("liberad") >= 0 || s.indexOf("conclui") >= 0) return "badge-status badge-approved";
return "badge-status badge-processing";
}
var BADGE_VARIANTS = "badge-waiting badge-pending badge-approved badge-rejected badge-blocked badge-processing";
function setBadge(selector, valor) {
var texto = String(valor || "").trim() || "-";
var classe = badgeClassByStatus(texto);
var textoLower = texto.toLowerCase();
var classe = badgeClassByStatus(texto);
// Mantem os badges de resumo da SC sem destaque verde para sucesso/geracao.
// Mantém badges de resumo da SC como "em andamento" para não inflar expectativa visual.
if (
(selector === "#statusSCProtheus_label" && textoLower.indexOf("sc cadastrada com sucesso") >= 0) ||
(selector === "#statusSC_label" && textoLower.indexOf("pedido gerado") >= 0)
) {
classe = "badge bg-info";
classe = "badge-status badge-processing";
}
$(selector)
.text(texto)
.removeClass("bg-secondary bg-success bg-danger bg-warning bg-info")
.removeClass(BADGE_VARIANTS)
.addClass(classe);
}
@@ -734,7 +764,7 @@ function renderizarResultadoCotacao(resumo) {
var statusApiTxt = escapeHTML(linha.statusApi || "-");
var statusRaw = String(linha.label || "").trim();
var statusTxt = escapeHTML(statusRaw);
var badgeStatus = linha.badge || "badge bg-secondary";
var badgeStatus = linha.badge || "badge-status badge-waiting";
var classeCard = classeCardCotacao(linha.tipo);
var qtdTxt = escapeHTML(String(linha.quantidade || "-"));
var entregaTxt = escapeHTML(normalizarDataProtheus(linha.dataPrevista || ""));
@@ -1303,3 +1333,66 @@ function beforeSendValidate(numState, nextState) {
}
return true;
}
/* ── Accordion de histórico de atividades ─────────────────────────
Chamada pelo script.js após cada showAndBlock() para colapsar
as seções de atividades já concluídas.
----------------------------------------------------------------- */
var ACTIVITY_META = {
"0": { titulo: "Dados da Solicitação", campos: ["usuarioSolicitante", "estabelecimento", "tipoSolicitacao"] },
"1": { titulo: "Dados da Solicitação", campos: ["usuarioSolicitante", "estabelecimento"] },
"4": { titulo: "Análise do Gestor", campos: ["userValidacaoGestor", "dataValidacaoGestor"] },
"6": { titulo: "Validação Compras", campos: ["userValidacaoCompras", "dataValidacaoCompras"] },
"24": { titulo: "Problema na Compra", campos: [] },
"31": { titulo: "Realização da Compra", campos: ["userRealizacaoCompras", "dataRealizacaoCompras"] },
"57": { titulo: "Aprovação p/ Cotação", campos: ["userCotacaoGestor", "dataAprovCompras"] },
"114": { titulo: "SC no Protheus", campos: [] },
"121": { titulo: "Validação da Diretoria", campos: ["user_validacao_gestor", "data_validacao_gestor"] }
};
function _lerCampoResumo(id) {
var $el = $("#" + id);
if (!$el.length) return "";
var val = $el.is("span, div") ? $el.text().trim() : String($el.val() || "").trim();
return (val && val !== "-") ? val : "";
}
function colapsarAtividadesAnteriores(numeros) {
for (var i = 0; i < numeros.length; i++) {
var num = numeros[i];
var $secao = $(".activity-" + num);
if (!$secao.length || $secao.hasClass("accordion-pronto")) continue;
var meta = ACTIVITY_META[String(num)] || { titulo: "Etapa " + num, campos: [] };
// Envolve o conteúdo inteiro num .activity-body colapsável
$secao.children().wrapAll('<div class="activity-body"></div>');
// Monta texto de resumo a partir dos campos da etapa já preenchida
var partes = [];
for (var c = 0; c < meta.campos.length && partes.length < 2; c++) {
var val = _lerCampoResumo(meta.campos[c]);
if (val) partes.push(escapeHTML(val));
}
var resumo = partes.length ? partes.join(" · ") : "Concluído";
// Injeta cabeçalho clicável antes do body
$secao.prepend(
'<div class="activity-header">' +
'<span class="activity-header-check">✓</span>' +
'<span class="activity-header-titulo">' + escapeHTML(meta.titulo) + '</span>' +
'<span class="activity-header-resumo">' + resumo + '</span>' +
'<span class="activity-header-caret">&#9660;</span>' +
'</div>'
);
$secao.addClass("accordion-pronto is-collapsed");
// Fecha sobre si mesmo para manter contexto correto no closure
(function ($s) {
$s.on("click.accordion", ".activity-header", function () {
$s.toggleClass("is-collapsed");
});
}($secao));
}
}