(function (){
if(!window.BDMChatPages) window.BDMChatPages={};
var EXTRATO_LIMITE=50;
function pick(obj, keys){
for (var i=0; i < keys.length; i++){
var k=keys[i];
if(obj&&obj[k]!=null&&String(obj[k]).trim()!=="") return obj[k];
}
return "";
}
function pickNumber(obj, keys){
var v=pick(obj, keys);
if(v===""||v==null) return 0;
var s=String(v).trim();
var n;
if(/,/.test(s)){
n=parseFloat(s.replace(/\./g, "").replace(",", "."));
}else{
n=parseFloat(s);
}
return isFinite(n) ? Math.round(n):0;
}
function isTruthy(v){
if(v===true||v===1||v==="1") return true;
if(v===false||v===0||v==="0") return false;
var s=String(v||"").trim().toLowerCase();
return s==="true"||s==="sim"||s==="s"||s==="ativo"||s==="ok";
}
function firstRecord(api){
if(!api) return {};
if(Array.isArray(api)&&api.length&&api[0]&&typeof api[0]==="object") return api[0];
if(api&&typeof api==="object"&&Array.isArray(api.data)&&api.data.length&&api.data[0]) return api.data[0];
if(api&&typeof api==="object") return api;
return {};}
function normalizeMovimentacoes(api){
if(!api) return [];
if(Array.isArray(api)) return api;
if(typeof api!=="object") return [];
var keys=["movimentacoes", "extrato", "movimentos", "lista", "items", "data", "rows", "historico"];
for (var i=0; i < keys.length; i++){
var arr=api[keys[i]];
if(Array.isArray(arr)) return arr;
}
return [];
}
function parseProgramaAtivo(row){
if(!row||typeof row!=="object") return true;
if(row.programa_ativo!=null) return isTruthy(row.programa_ativo);
if(row.programaAtivo!=null) return isTruthy(row.programaAtivo);
if(row.ativo!=null) return isTruthy(row.ativo);
return true;
}
function parseRegrasBlock(row){
var mensagem="";
var lista=[];
var block=row&&row.regras;
if(block&&typeof block==="object"&&!Array.isArray(block)){
mensagem=String(block.mensagem||"").trim();
if(Array.isArray(block.regras)){
lista=block.regras.map(function (s){ return String(s).trim(); }).filter(Boolean);
}}
if(!mensagem){
mensagem=String(pick(row, ["mensagem", "mensagem_programa", "mensagemPrograma", "destaque_mensagem", "destaque"])||"").trim();
}
if(!lista.length){
var flat=row.regras||row.regras_lista||row.regrasLista;
if(typeof flat==="string"){
lista=flat.split(/\r?\n/).map(function (s){ return s.trim(); }).filter(Boolean);
}else if(Array.isArray(flat)){
lista=flat.map(function (s){ return String(s).trim(); }).filter(Boolean);
}}
return { mensagem: mensagem, regras: lista };}
function normalizeResumo(api){
var row=firstRecord(api);
var regrasBlock=parseRegrasBlock(row);
return {
programaAtivo: parseProgramaAtivo(row),
saldo: pickNumber(row, ["saldo", "pontos", "pontos_saldo", "total_pontos", "pontos_disponiveis"]),
totalGanho: pickNumber(row, ["total_ganho", "totalGanho", "pontos_ganhos", "ganho", "pontos_ganho"]),
totalGasto: pickNumber(row, ["total_gasto", "totalGasto", "total_utilizado", "pontos_utilizados", "utilizado", "pontos_usados"]),
mensagem: regrasBlock.mensagem,
regras: regrasBlock.regras
};}
function formatDateTimeBR(raw){
if(raw==null||raw==="") return "—";
var s=String(raw).trim();
var m=s.match(/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2})/);
if(m) return m[3] + "/" + m[2] + "/" + m[1] + " " + m[4] + ":" + m[5];
m=s.match(/^(\d{2})\/(\d{2})\/(\d{4})[ T](\d{2}):(\d{2})/);
if(m) return m[0].replace(" ", " ").slice(0, 16);
return formatDateBR(s);
}
function formatDateBR(raw){
if(raw==null||raw==="") return "—";
var s=String(raw).trim();
var m=s.match(/^(\d{4})-(\d{2})-(\d{2})/);
if(m) return m[3] + "/" + m[2] + "/" + m[1];
m=s.match(/^(\d{2})\/(\d{2})\/(\d{4})/);
if(m) return m[0];
return s.length > 10 ? s.slice(0, 10):s;
}
function labelTipoMov(tipo){
var raw=String(tipo||"").trim();
if(!raw) return "Movimentação";
return raw
.replace(/_/g, " ")
.split(/\s+/)
.filter(Boolean)
.map(function (word){
return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
})
.join(" ");
}
function normalizeMovimentacao(row){
if(!row||typeof row!=="object") return null;
var pontos=pickNumber(row, ["pontos"]);
if(pontos===0&&row.pontos!=null&&row.pontos!==""){
pontos=parseFloat(String(row.pontos).replace(",", "."));
if(!isFinite(pontos)) pontos=0;
else pontos=Math.round(pontos);
}
var tipoRaw=String(pick(row, ["tipo", "tipo_movimento", "operacao"])||"").toLowerCase();
if(pontos > 0&&(tipoRaw.indexOf("debit") >=0||tipoRaw.indexOf("resgat") >=0||tipoRaw.indexOf("gasto") >=0)){
pontos=-Math.abs(pontos);
}
return {
tipo: pick(row, ["tipo", "tipo_movimento", "operacao"]),
descricao: String(pick(row, ["descricao", "motivo", "observacao"])||"").trim(),
criadoEm: formatDateTimeBR(pick(row, ["criado_em", "criadoEm", "data", "data_movimento"])),
pontos: pontos
};}
function setText(node, slot, value){
var el=node.querySelector('[data-slot="' + slot + '"]');
if(el) el.textContent=value;
}
function applyResumo(ctx, node, resumo){
var inativo=node.querySelector('[data-slot="pontos-inativo"]');
var ativo=node.querySelector('[data-slot="pontos-ativo"]');
if(!resumo.programaAtivo){
if(inativo){
var p=inativo.querySelector("p");
if(p){
p.textContent=resumo.aviso||"O programa de fidelidade não está disponível no momento.";
}
inativo.removeAttribute("hidden");
}
if(ativo) ativo.setAttribute("hidden", "hidden");
return;
}
if(inativo) inativo.setAttribute("hidden", "hidden");
if(ativo) ativo.removeAttribute("hidden");
setText(node, "pontos-saldo", String(resumo.saldo));
setText(node, "pontos-ganho", String(resumo.totalGanho));
setText(node, "pontos-utilizado", String(resumo.totalGasto));
var mensagemEl=node.querySelector('[data-slot="pontos-mensagem"]');
if(mensagemEl){
if(resumo.mensagem){
mensagemEl.textContent=resumo.mensagem;
mensagemEl.removeAttribute("hidden");
}else{
mensagemEl.textContent="";
mensagemEl.setAttribute("hidden", "hidden");
}}
var regrasEl=node.querySelector('[data-slot="pontos-regras"]');
if(regrasEl){
regrasEl.innerHTML="";
resumo.regras.forEach(function (linha){
regrasEl.appendChild(ctx.el("li", { text: linha }));
});
if(resumo.regras.length) regrasEl.removeAttribute("hidden");
else regrasEl.setAttribute("hidden", "hidden");
}}
function setExtratoLoading(node, loading){
var loadingEl=node.querySelector('[data-slot="pontos-extrato-loading"]');
var refreshBtn=node.querySelector(".bdm-pontos-extrato-refresh");
if(loadingEl){
if(loading){
loadingEl.removeAttribute("hidden");
loadingEl.classList.add("-on");
}else{
loadingEl.setAttribute("hidden", "hidden");
loadingEl.classList.remove("-on");
}}
if(refreshBtn){
refreshBtn.disabled = !!loading;
}}
function renderExtratoList(ctx, node, rows){
var listEl=node.querySelector('[data-slot="pontos-extrato-list"]');
var emptyEl=node.querySelector('[data-slot="pontos-extrato-empty"]');
if(!listEl) return;
listEl.innerHTML="";
rows.forEach(function (row){
var m=normalizeMovimentacao(row);
if(!m) return;
var item=ctx.el("div", { class: "bdm-pontos-extrato-item" });
var main=ctx.el("div", { class: "bdm-pontos-extrato-main" });
main.appendChild(ctx.el("h3", { class: "bdm-pontos-extrato-tipo", text: labelTipoMov(m.tipo) }));
if(m.descricao){
main.appendChild(ctx.el("p", { class: "bdm-pontos-extrato-desc", text: m.descricao }));
}
main.appendChild(ctx.el("p", { class: "bdm-pontos-extrato-date", text: m.criadoEm }));
item.appendChild(main);
var noteClass=m.pontos >=0 ? "-credit":"-debit";
var prefix=m.pontos > 0 ? "+":"";
item.appendChild(ctx.el("b", {
class: "bdm-pontos-extrato-delta " + noteClass,
text: prefix + String(m.pontos)
}));
listEl.appendChild(item);
});
if(emptyEl){
if(!listEl.children.length) emptyEl.removeAttribute("hidden");
else emptyEl.setAttribute("hidden", "hidden");
}}
function loadExtrato(ctx, node){
var pages=window.BDMChatPages||{};
var uid=pages.getUsuarioId ? pages.getUsuarioId():0;
var url=(ctx.urls.pontosExtrato||"").trim();
if(!uid||!url){
setExtratoLoading(node, false);
renderExtratoList(ctx, node, []);
var emptyEl=node.querySelector('[data-slot="pontos-extrato-empty"]');
if(emptyEl){
emptyEl.textContent="Extrato indisponível.";
emptyEl.removeAttribute("hidden");
}
return;
}
setExtratoLoading(node, true);
var extratoPromise=pages.fetchWidgetJson
? pages.fetchWidgetJson(ctx, "pontosExtrato", { id_usuario: uid, limite: EXTRATO_LIMITE }, url)
: fetch(url, {
method: "POST",
credentials: "same-origin",
headers: pages.mergeWidgetAuthHeaders({ "Content-Type": "application/json" }),
body: JSON.stringify({ id_usuario: uid, limite: EXTRATO_LIMITE })
}).then(function (r){ return r.json(); });
extratoPromise
.then(function (api){
var rows=normalizeMovimentacoes(api);
renderExtratoList(ctx, node, rows);
})
.catch(function (){
var listEl=node.querySelector('[data-slot="pontos-extrato-list"]');
if(listEl) listEl.innerHTML="";
var emptyEl=node.querySelector('[data-slot="pontos-extrato-empty"]');
if(emptyEl){
emptyEl.textContent="Falha ao carregar o extrato.";
emptyEl.removeAttribute("hidden");
}})
.finally(function (){
setExtratoLoading(node, false);
});
}
function wireTabs(ctx, node){
var tabs=node.querySelectorAll(".bdm-pontos-tab");
var panels=node.querySelectorAll(".bdm-pontos-panel");
var refreshBtn=node.querySelector(".bdm-pontos-extrato-refresh");
function showTab(name){
for (var i=0; i < tabs.length; i++){
var tab=tabs[i];
var on=tab.getAttribute("data-tab")===name;
tab.classList.toggle("-active", on);
tab.setAttribute("aria-selected", on ? "true":"false");
}
for (var j=0; j < panels.length; j++){
var panel=panels[j];
var show=panel.getAttribute("data-panel")===name;
if(show) panel.removeAttribute("hidden");
else panel.setAttribute("hidden", "hidden");
}
if(name==="extrato"&&ctx.state.pontosExtratoLoaded!==true){
ctx.state.pontosExtratoLoaded=true;
loadExtrato(ctx, node);
}}
for (var k=0; k < tabs.length; k++){
tabs[k].addEventListener("click", function (){
var tabName=this.getAttribute("data-tab");
if(tabName) showTab(tabName);
});
}
if(refreshBtn){
refreshBtn.addEventListener("click", function (){
loadExtrato(ctx, node);
});
}
showTab("resumo");
}
function mountPage(ctx, node, resumo){
wireTabs(ctx, node);
applyResumo(ctx, node, resumo||{
programaAtivo: true,
saldo: 0,
totalGanho: 0,
totalGasto: 0,
mensagem: "",
regras: []
});
ctx.body.innerHTML="";
ctx.body.appendChild(node);
}
window.BDMChatPages.pontosFidelidade=function (ctx){
ctx.state.currentView="pontosFidelidade";
ctx.state.pontosExtratoLoaded=false;
var pages=window.BDMChatPages||{};
var url=(ctx.urls.pontosFidelidade||"").trim();
function mountShell(msg){
ctx.loadTemplate("pontos-fidelidade").then(function (html){
var node=ctx.htmlToNode(html);
var resumo={
programaAtivo: false,
saldo: 0,
totalGanho: 0,
totalGasto: 0,
mensagem: "",
regras: [],
aviso: msg||"O programa de fidelidade não está disponível no momento."
};
mountPage(ctx, node, resumo);
}).catch(function (){
ctx.body.textContent="Falha ao carregar pontos de fidelidade.";
});
}
if(!pages.isLogged||!pages.isLogged()){
mountShell("Faça login para ver seus pontos.");
return;
}
var uid=pages.getUsuarioId ? pages.getUsuarioId():0;
if(!uid){
mountShell("Não foi possível identificar sua conta. Faça login novamente.");
return;
}
if(!url){
mountShell("Programa de fidelidade não configurado.");
return;
}
var saldoPromise=pages.fetchWidgetJson
? pages.fetchWidgetJson(ctx, "pontosSaldo", { id_usuario: uid }, url)
: fetch(url, {
method: "POST",
credentials: "same-origin",
headers: pages.mergeWidgetAuthHeaders({ "Content-Type": "application/json" }),
body: JSON.stringify({ id_usuario: uid })
}).then(function (r){ return r.json(); });
Promise.all([
ctx.loadTemplate("pontos-fidelidade"),
saldoPromise
])
.then(function (pack){
var node=ctx.htmlToNode(pack[0]);
mountPage(ctx, node, normalizeResumo(pack[1]));
})
.catch(function (){
ctx.body.textContent="Falha ao carregar seus pontos.";
});
};})();