var INDICADORES = [
{ pilar: "PILAR ARQUITETURA", indicador: "Fotos da Fachada (letreiro luminoso com acessibilidade)", penalidade: "GRAVISSIMA", peso: 4, maxFotos: 1 },
{ pilar: "PILAR ARQUITETURA", indicador: "Fotos de todos equipamentos", detalhe: "Mobiliario, gondolas, tela digital, caixa, mesas, cavalete, baianas e coringa.", penalidade: "GRAVE", peso: 3, maxFotos: 8 },
{ pilar: "PILAR ARQUITETURA", indicador: "Fotos da iluminacao (luzes da vitrine e interior da loja)", penalidade: "GRAVE", peso: 3, maxFotos: 2 },
{ pilar: "PILAR ARQUITETURA", indicador: "Foto do coletor de embalagem (Botirecicla)", penalidade: "MEDIA", peso: 2, maxFotos: 1 },
{ pilar: "PILAR ARQUITETURA", indicador: "Fotos dos mobshops da loja", penalidade: "MEDIA", peso: 2, maxFotos: 2 },
{ pilar: "PILAR VISUAL MERCHANDISING", indicador: "Foto da vitrine (identificando todas comunicacoes)", penalidade: "GRAVE", peso: 3, maxFotos: 1 },
{ pilar: "PILAR VISUAL MERCHANDISING", indicador: "Fotos enquadrando cada sessao", detalhe: "Feminina, masculina, infantil, cuidados, cabelos, presentes e maquiagem.", penalidade: "GRAVE", peso: 3, maxFotos: 7 },
{ pilar: "PILAR VISUAL MERCHANDISING", indicador: "Fotos das comunicacoes destaques e storytelling", detalhe: "Feminina, masculina e cuidados.", penalidade: "GRAVE", peso: 3, maxFotos: 3 },
{ pilar: "PILAR VISUAL MERCHANDISING", indicador: "Foto das embalagens", penalidade: "MEDIA", peso: 2, maxFotos: 1 },
{ pilar: "PILAR VISUAL MERCHANDISING", indicador: "Foto do QR-Code de politica de privacidade", penalidade: "GRAVISSIMA", peso: 4, maxFotos: 1 },
{ pilar: "PILAR VISUAL MERCHANDISING", indicador: "Foto do codigo de defesa do consumidor", penalidade: "GRAVISSIMA", peso: 4, maxFotos: 1 },
{ pilar: "PILAR VISUAL MERCHANDISING", indicador: "Foto do verso da tela digital", penalidade: "GRAVE", peso: 3, maxFotos: 1 },
{ pilar: "PILAR EXPOSIÇÃO", indicador: "Fotos das datas de validade dos produtos", detalheBullets: [
"# Produtos O Boticario",
"Cooffe Woman",
"Linha Casa 214",
"5 itens da linha Botik",
"Dr. Botica",
"Portinari",
"Celebre",
"Floratta",
"Arbo",
"Shampoo e Condicionador - Linha Match",
"5 provadores de Make B",
"5 provadores da linha Intense",
"# Produtos QDB?",
"2 itens da linha Instamatte",
"Protetor solar facial",
"Corretivo liquido",
"Mascara para cilios",
"10 batons hidratantes",
"Shampoo e Condicionador Au.migos"
], penalidade: "GRAVISSIMA", peso: 4, maxFotos: 22 },
{ pilar: "PILAR EXPOSIÇÃO", indicador: "Foto dos aplicadores descartaveis", penalidade: "MEDIA", peso: 2, maxFotos: 1 },
{ pilar: "PILAR EXPOSIÇÃO", indicador: "Foto da exposição da sessão Make.B", penalidade: "GRAVE", peso: 3, maxFotos: 1 },
{ pilar: "PILAR EXPOSIÇÃO", indicador: "Foto da exposição da sessão Intense", penalidade: "GRAVE", peso: 3, maxFotos: 1 },
{ pilar: "PILAR UNIFORME", indicador: "Fotos dos uniformes (do pescoco para baixo)", penalidade: "GRAVE", peso: 3, maxFotos: 2 },
{ pilar: "PILAR INFORMATIVA", indicador: "Foto do espaco onde ficam os produtos destinados a logistica", penalidade: "NAO PONTUA", peso: 0, maxFotos: 1 }
];
var FATORES = {
"CONFORME": 1,
"NAO_CONFORME": 0
};
var ALLOWED_EXT = { "pdf": true, "jpg": true, "jpeg": true, "png": true };
var REQUIRE_ATTACHMENT = false; // mude para true para voltar a exigir anexo
var CURRENT_PROFILE = "LOJA";
var KNOWN_ATTACHMENT_KEYS = {};
// Ajuste os codigos de atividade do seu processo aqui.
var FLOW_CONFIG = {
lojaStates: [0, 4],
analistaStates: [5]
};
function badgeClass(penalidade) {
if (penalidade === "GRAVISSIMA") return "danger";
if (penalidade === "GRAVE") return "warning";
if (penalidade === "MEDIA") return "info";
if (penalidade === "LEVE") return "default";
return "primary";
}
function getClassificacao(score) {
if (score >= 90) return "Excelente";
if (score >= 80) return "Bom";
if (score >= 70) return "Regular";
return "Critico";
}
function toTitleCase(text) {
var s = String(text || "").toLowerCase().trim();
if (!s) return "";
var words = s.split(/\s+/);
for (var i = 0; i < words.length; i++) {
var w = words[i];
if (!w) continue;
words[i] = w.charAt(0).toUpperCase() + w.slice(1);
}
return words.join(" ");
}
function indicadorCountLabel(n) {
return n === 1 ? "1 indicador" : (n + " indicadores");
}
function renderDetalhe(item) {
if (Array.isArray(item.detalheBullets) && item.detalheBullets.length) {
var html = "
";
for (var i = 0; i < item.detalheBullets.length; i++) {
var txt = String(item.detalheBullets[i] || "");
if (txt.indexOf("# ") === 0) {
html += "
" + escapeHtml(txt.substring(2)) + "
";
} else {
html += "
" + escapeHtml(txt) + "
";
}
}
html += "
";
return html;
}
if (item.detalhe) {
return "
" + escapeHtml(item.detalhe) + "
";
}
return "";
}
function getResumoPilaresHtml() {
var rows = [
{ nome: "Arquitetura", texto: "Fachada da loja e estrutura física, evidenciando marca, iluminação, acessibilidade, equipamentos e estado geral do ambiente." },
{ nome: "Visual Merchandising", texto: "Vitrine e área interna com comunicação vigente, padrão visual, organização, embalagens corretas e bom estado dos materiais." },
{ nome: "Exposição", texto: "Exposição de produtos em vitrine e interior, com precificação, validade visível, testes, preenchimento de prateleiras e uso de aplicadores." },
{ nome: "Uniforme", texto: "Equipe em atendimento com uso correto de uniforme, calçados e acessórios conforme padrão estabelecido." },
{ nome: "Informativa", texto: "Ambiente com foco em informações operacionais, logística reversa, armazenamento de materiais e comunicação de serviços." }
];
var html = "
Guia dos Pilares
";
for (var i = 0; i < rows.length; i++) {
html += "
";
return html;
}
function buildAnexoInputs(index, maxFotos) {
var total = parseInt(maxFotos, 10);
if (isNaN(total) || total < 1) total = 1;
var html = "
";
for (var i = 1; i <= total; i++) {
var anexoId = "anexo_" + index + "_" + i;
var anexoFileName = "EVID_" + index + "_F" + i;
var extraClass = i > 2 ? " extra-slot" : "";
html += ""
+ "
"
+ "
Foto " + i + " de " + total + "
"
+ ""
+ "
";
}
html += "
";
if (total > 2) {
html += "";
}
return html;
}
function buildAuditRow(item, index) {
var selectResultado = ""
+ "";
var maxFotos = parseInt(item.maxFotos, 10);
if (isNaN(maxFotos) || maxFotos < 1) maxFotos = 1;
var anexosHtml = buildAnexoInputs(index, maxFotos);
return ""
+ "
"
+ "
"
+ "
"
+ "
"
+ "
" + escapeHtml(item.indicador) + "
"
+ renderDetalhe(item)
+ "
"
+ "
"
+ anexosHtml
+ "
0/" + maxFotos + " fotos enviadas
"
+ "
Use os botoes de upload/visualizar em cada foto.
"
+ "
"
+ "
"
+ "
"
+ "
Penalidade
Aguardando
"
+ "
Peso
" + item.peso + "
"
+ "
Fator
-
"
+ "
Pontuacao
0
"
+ "
Resultado
" + selectResultado + "
"
+ "
"
+ ""
+ "
"
+ "
";
}
function montaTabela() {
var grupos = {};
for (var i = 0; i < INDICADORES.length; i++) {
var item = INDICADORES[i];
if (!grupos[item.pilar]) grupos[item.pilar] = [];
grupos[item.pilar].push(item);
}
var pilares = Object.keys(grupos);
var html = "";
var rowIndex = 1;
for (var p = 0; p < pilares.length; p++) {
var nomePilar = pilares[p];
var linhas = grupos[nomePilar];
var openStyle = " style='display:none;'";
var totalFotosPilar = 0;
for (var t = 0; t < linhas.length; t++) {
totalFotosPilar += parseInt(linhas[t].maxFotos, 10) || 0;
}
html += "