att
This commit is contained in:
@@ -455,6 +455,66 @@ function limparNumeroDocumento(valor) {
|
||||
return v;
|
||||
}
|
||||
|
||||
function normalizarCodigoComparacao(valor) {
|
||||
var v = String(valor || "").trim();
|
||||
if (!v) return "";
|
||||
return v.replace(/^0+/, "");
|
||||
}
|
||||
|
||||
function documentoEhPlaceholder(valor) {
|
||||
var v = String(valor || "").trim().toUpperCase();
|
||||
if (!v) return true;
|
||||
if (v === "XXXX" || v === "XXXXXX") return true;
|
||||
return /^X+$/.test(v);
|
||||
}
|
||||
|
||||
function linhaCotacaoVencedora(row) {
|
||||
var pedido = String(row.C8_NUMPED || "").trim();
|
||||
var itemPedido = String(row.C8_ITEMPED || "").trim();
|
||||
var fornece = String(row.C8_FORNECE || "").trim();
|
||||
var loja = String(row.C8_LOJA || "").trim();
|
||||
|
||||
if (documentoEhPlaceholder(pedido)) return false;
|
||||
if (documentoEhPlaceholder(itemPedido)) return false;
|
||||
if (!fornece || !loja) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function possuiFornecedorCotacao(row) {
|
||||
var fornece = String(row.C8_FORNECE || "").trim();
|
||||
var loja = String(row.C8_LOJA || "").trim();
|
||||
return !!(fornece && loja);
|
||||
}
|
||||
|
||||
function classificarLinhaCotacao(row) {
|
||||
var status = String(row.STATUS || "").trim().toUpperCase();
|
||||
|
||||
if (linhaCotacaoVencedora(row)) {
|
||||
return { tipo: "PEDIDO_GERADO", label: "VENCEDOR", badge: "badge bg-success", tipoFornecedor: "Fornecedor homologado" };
|
||||
}
|
||||
|
||||
if (possuiFornecedorCotacao(row)) {
|
||||
return { tipo: "FORNECEDOR_HOMOLOGADO", label: "Homologado", badge: "badge bg-info", tipoFornecedor: "Fornecedor homologado" };
|
||||
}
|
||||
|
||||
if (status.indexOf("PEDIDO_GERADO") >= 0) {
|
||||
return { tipo: "PERDEDOR", label: "PERDEDOR", badge: "badge bg-warning", tipoFornecedor: "-" };
|
||||
}
|
||||
|
||||
if (!possuiFornecedorCotacao(row)) {
|
||||
return { tipo: "NOVO_FORNECEDOR", label: "Novo", badge: "badge bg-primary", tipoFornecedor: "Novo fornecedor" };
|
||||
}
|
||||
|
||||
return { tipo: "EM_COTACAO", label: "EM COTACAO", badge: "badge bg-secondary", tipoFornecedor: "-" };
|
||||
}
|
||||
|
||||
function formatarValorCotacao(valor) {
|
||||
var txt = String(valor || "").trim();
|
||||
if (!txt) return "-";
|
||||
return floatToBRL(parseNumeroCotacao(txt));
|
||||
}
|
||||
|
||||
function comporDataHora(data, hora) {
|
||||
var d = String(data || "").trim();
|
||||
var h = String(hora || "").trim();
|
||||
@@ -547,6 +607,220 @@ function renderizarTimelineSC(dados) {
|
||||
$("#scTimeline").html(html);
|
||||
}
|
||||
|
||||
function renderizarResultadoCotacao(resumo) {
|
||||
var badge = $("#cotacaoResultado_label");
|
||||
var lista = $("#cotacaoResultadoLista");
|
||||
if (!badge.length || !lista.length) return;
|
||||
|
||||
if (!resumo || !resumo.detalhes || !resumo.detalhes.length) {
|
||||
setBadge("#cotacaoResultado_label", "Sem cotacao");
|
||||
lista.html('<li class="sc-cotacao-item"><span class="sc-cotacao-item-info">Aguardando vinculo da cotacao na SC.</span></li>');
|
||||
return;
|
||||
}
|
||||
|
||||
var statusResumo = "Sem fornecedor definido";
|
||||
if ((resumo.qtdPedidoGerado || 0) > 0) {
|
||||
statusResumo = "Pedido gerado em " + resumo.qtdPedidoGerado + " item(ns)";
|
||||
} else if ((resumo.qtdFornecedorHomologado || 0) > 0) {
|
||||
statusResumo = "Fornecedor homologado em " + resumo.qtdFornecedorHomologado + " item(ns)";
|
||||
} else if ((resumo.qtdNovoFornecedor || 0) > 0) {
|
||||
statusResumo = "Novo fornecedor em " + resumo.qtdNovoFornecedor + " item(ns)";
|
||||
}
|
||||
|
||||
setBadge("#cotacaoResultado_label", statusResumo);
|
||||
|
||||
var html = resumo.detalhes.map(function (linha) {
|
||||
var numeroTxt = escapeHTML(linha.numero || "-");
|
||||
var itemTxt = escapeHTML(linha.item || "-");
|
||||
var produtoTxt = escapeHTML(linha.produto || "-");
|
||||
var fornecedorTxt = escapeHTML(linha.fornecedor || "-");
|
||||
var tipoFornecedorTxt = escapeHTML(linha.tipoFornecedor || "-");
|
||||
var precoTxt = escapeHTML(formatarValorCotacao(linha.preco));
|
||||
var totalTxt = escapeHTML(formatarValorCotacao(linha.total));
|
||||
var pedidoTxt = escapeHTML(linha.pedido || "-");
|
||||
var statusApiTxt = escapeHTML(linha.statusApi || "-");
|
||||
var statusTxt = escapeHTML(linha.label || "EM COTACAO");
|
||||
var badgeStatus = linha.badge || "badge bg-secondary";
|
||||
|
||||
return [
|
||||
'<li class="sc-cotacao-item">',
|
||||
' <span class="sc-cotacao-item-info"><strong>Cotacao ' + numeroTxt + '</strong> | Item ' + itemTxt + " | Produto: " + produtoTxt + " | Fornecedor: " + fornecedorTxt + " | Tipo: " + tipoFornecedorTxt + " | Preco: " + precoTxt + " | Total: " + totalTxt + " | Pedido: " + pedidoTxt + " | Status: " + statusApiTxt + "</span>",
|
||||
' <span class="' + badgeStatus + '">' + statusTxt + "</span>",
|
||||
"</li>"
|
||||
].join("");
|
||||
}).join("");
|
||||
|
||||
lista.html(html);
|
||||
}
|
||||
|
||||
function renderizarErroCotacao(mensagem) {
|
||||
var lista = $("#cotacaoResultadoLista");
|
||||
if (!lista.length) return;
|
||||
|
||||
setBadge("#cotacaoResultado_label", "Erro consulta cotacao");
|
||||
lista.html(
|
||||
'<li class="sc-cotacao-item"><span class="sc-cotacao-item-info">' +
|
||||
escapeHTML(mensagem || "Nao foi possivel carregar a cotacao no momento.") +
|
||||
"</span></li>"
|
||||
);
|
||||
}
|
||||
|
||||
function montarResumoCotacaoPorLinhas(rows, cotacao) {
|
||||
if (!rows || !rows.length) return null;
|
||||
|
||||
var filtroCotacao = normalizarCodigoComparacao(cotacao);
|
||||
var filtradas = rows.filter(function (row) {
|
||||
var erro = String(row.erro || row.ERRO || "").trim();
|
||||
if (erro) return false;
|
||||
|
||||
var sucesso = String(row.sucesso || row.SUCESSO || "").trim().toLowerCase();
|
||||
if (sucesso === "false") return false;
|
||||
|
||||
var numeroLinha = normalizarCodigoComparacao(row.C8_NUM || "");
|
||||
if (filtroCotacao && numeroLinha && numeroLinha !== filtroCotacao) return false;
|
||||
|
||||
var item = String(row.C8_ITEM || row.C8_ITEMSC || "").trim();
|
||||
var fornecedor = String(row.C8_FORNECE || "").trim();
|
||||
var pedido = String(row.C8_NUMPED || "").trim();
|
||||
return !!(item || fornecedor || pedido);
|
||||
});
|
||||
|
||||
if (!filtradas.length) return null;
|
||||
|
||||
var porItem = {};
|
||||
var detalhes = [];
|
||||
filtradas.forEach(function (row) {
|
||||
var item = String(row.C8_ITEM || row.C8_ITEMSC || "").trim();
|
||||
if (!item) return;
|
||||
if (!porItem[item]) porItem[item] = [];
|
||||
porItem[item].push(row);
|
||||
|
||||
var classif = classificarLinhaCotacao(row);
|
||||
detalhes.push({
|
||||
numero: String(row.C8_NUM || "").trim(),
|
||||
item: item,
|
||||
produto: String(row.C8_PRODUTO || "").trim(),
|
||||
fornecedor: possuiFornecedorCotacao(row)
|
||||
? (String(row.C8_FORNECE || "").trim() + "/" + String(row.C8_LOJA || "").trim())
|
||||
: "",
|
||||
preco: row.C8_PRECO,
|
||||
total: row.C8_TOTAL,
|
||||
pedido: String(row.C8_NUMPED || "").trim(),
|
||||
statusApi: String(row.STATUS || "").trim(),
|
||||
tipo: classif.tipo,
|
||||
label: classif.label,
|
||||
badge: classif.badge,
|
||||
tipoFornecedor: classif.tipoFornecedor
|
||||
});
|
||||
});
|
||||
|
||||
var itens = [];
|
||||
var qtdPedidoGerado = 0;
|
||||
var qtdFornecedorHomologado = 0;
|
||||
var qtdNovoFornecedor = 0;
|
||||
|
||||
Object.keys(porItem).sort().forEach(function (item) {
|
||||
var linhas = porItem[item];
|
||||
var vencedorPedido = null;
|
||||
var fornecedorHomologado = null;
|
||||
var fornecedorNovo = null;
|
||||
|
||||
for (var i = 0; i < linhas.length; i++) {
|
||||
if (linhaCotacaoVencedora(linhas[i])) {
|
||||
vencedorPedido = linhas[i];
|
||||
break;
|
||||
}
|
||||
var fornece = String(linhas[i].C8_FORNECE || "").trim();
|
||||
var loja = String(linhas[i].C8_LOJA || "").trim();
|
||||
if (!fornecedorHomologado && fornece && loja) {
|
||||
fornecedorHomologado = linhas[i];
|
||||
}
|
||||
if (!fornecedorNovo && !fornece && !loja) {
|
||||
fornecedorNovo = linhas[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (vencedorPedido) {
|
||||
qtdPedidoGerado++;
|
||||
itens.push({
|
||||
item: item,
|
||||
fornecedor: String(vencedorPedido.C8_FORNECE || "").trim() + "/" + String(vencedorPedido.C8_LOJA || "").trim(),
|
||||
pedido: String(vencedorPedido.C8_NUMPED || "").trim(),
|
||||
tipo: "PEDIDO_GERADO"
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (fornecedorHomologado) {
|
||||
qtdFornecedorHomologado++;
|
||||
itens.push({
|
||||
item: item,
|
||||
fornecedor: String(fornecedorHomologado.C8_FORNECE || "").trim() + "/" + String(fornecedorHomologado.C8_LOJA || "").trim(),
|
||||
pedido: String(fornecedorHomologado.C8_NUMPED || "").trim(),
|
||||
tipo: "FORNECEDOR_HOMOLOGADO"
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (fornecedorNovo) {
|
||||
qtdNovoFornecedor++;
|
||||
itens.push({
|
||||
item: item,
|
||||
fornecedor: String(fornecedorNovo.A2_NOME || fornecedorNovo.A2_NREDUZ || "").trim(),
|
||||
pedido: String(fornecedorNovo.C8_NUMPED || "").trim(),
|
||||
tipo: "NOVO_FORNECEDOR"
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
itens.push({
|
||||
item: item,
|
||||
fornecedor: "",
|
||||
pedido: "",
|
||||
tipo: "EM_COTACAO"
|
||||
});
|
||||
});
|
||||
|
||||
return {
|
||||
itens: itens,
|
||||
detalhes: detalhes,
|
||||
qtdPedidoGerado: qtdPedidoGerado,
|
||||
qtdFornecedorHomologado: qtdFornecedorHomologado,
|
||||
qtdNovoFornecedor: qtdNovoFornecedor
|
||||
};
|
||||
}
|
||||
|
||||
function consultarResultadoCotacao(cotacao) {
|
||||
if (!cotacao || typeof DatasetFactory === "undefined" || typeof ConstraintType === "undefined") {
|
||||
renderizarResultadoCotacao(null);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
var cCotacao = DatasetFactory.createConstraint("numCotacao", cotacao, cotacao, ConstraintType.MUST);
|
||||
var ds = DatasetFactory.getDataset("dsComprasCotacao", null, [cCotacao], null);
|
||||
var rows = (ds && ds.values) ? ds.values : [];
|
||||
|
||||
if (!rows.length) {
|
||||
renderizarResultadoCotacao(null);
|
||||
return;
|
||||
}
|
||||
|
||||
var erroLinha = rows.find(function (row) {
|
||||
return String(row.erro || row.ERRO || "").trim();
|
||||
});
|
||||
if (erroLinha) {
|
||||
renderizarErroCotacao(String(erroLinha.erro || erroLinha.ERRO || "").trim());
|
||||
return;
|
||||
}
|
||||
|
||||
renderizarResultadoCotacao(montarResumoCotacaoPorLinhas(rows, cotacao));
|
||||
} catch (e) {
|
||||
console.warn("Nao foi possivel consultar resultado da cotacao no dsComprasCotacao:", e);
|
||||
renderizarResultadoCotacao(null);
|
||||
}
|
||||
}
|
||||
|
||||
function focarTimelineSC() {
|
||||
var secao = $("#scTimelineSection");
|
||||
if (!secao.length) return;
|
||||
@@ -607,7 +881,7 @@ function montarStatusAndamento(scRow, cotacao, pedido) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function preencherResumoSC() {
|
||||
function preencherResumoSC(resumoCotacao, erroCotacao) {
|
||||
var numero = valorCampo("numeroSCProtheus");
|
||||
var statusCadastro = valorCampo("statusSCProtheus");
|
||||
var solicitante = valorCampo("solicitanteSCProtheus");
|
||||
@@ -650,6 +924,16 @@ function preencherResumoSC() {
|
||||
cotacao: cotacao,
|
||||
pedido: pedido
|
||||
});
|
||||
|
||||
if (erroCotacao) {
|
||||
renderizarErroCotacao(erroCotacao);
|
||||
} else if (resumoCotacao && resumoCotacao.itens && resumoCotacao.itens.length) {
|
||||
renderizarResultadoCotacao(resumoCotacao);
|
||||
} else if (cotacao) {
|
||||
consultarResultadoCotacao(cotacao);
|
||||
} else {
|
||||
renderizarResultadoCotacao(null);
|
||||
}
|
||||
}
|
||||
|
||||
function consultarAndamentoSC() {
|
||||
@@ -678,7 +962,19 @@ function consultarAndamentoSC() {
|
||||
var andamento = montarStatusAndamento(row, cotacao, pedido);
|
||||
if (andamento) $("#statusAtendimento").val(andamento);
|
||||
|
||||
preencherResumoSC();
|
||||
var resumoCotacao = null;
|
||||
var erroCotacao = String(row.COTACAO_ERRO || "").trim();
|
||||
var jsonCotacoes = String(row.COTACOES_JSON || "").trim();
|
||||
if (jsonCotacoes) {
|
||||
try {
|
||||
var cotacoes = JSON.parse(jsonCotacoes);
|
||||
resumoCotacao = montarResumoCotacaoPorLinhas(cotacoes, cotacao);
|
||||
} catch (eCot) {
|
||||
if (!erroCotacao) erroCotacao = "Falha ao ler cotacoes retornadas pelo ds_consultaSC";
|
||||
}
|
||||
}
|
||||
|
||||
preencherResumoSC(resumoCotacao, erroCotacao);
|
||||
} catch (e) {
|
||||
console.warn("Nao foi possivel consultar andamento da SC no ds_consultaSC:", e);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user