(function (){
if(!window.BDMChatPages) window.BDMChatPages={};
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 pickText(obj, keys){
var v=pick(obj, keys);
if(v==null||v==="") return "";
if(typeof v==="object"){
var inner=pick(v, ["nome", "name", "titulo", "title", "descricao"]);
if(inner!=null&&inner!=="") return String(inner);
return "";
}
return String(v);
}
function normalizeList(api){
if(!api) return [];
if(Array.isArray(api)) return api;
if(typeof api!=="object") return [];
var keys=["reservas", "lista", "items", "data", "rows"];
for (var j=0; j < keys.length; j++){
var arr=api[keys[j]];
if(Array.isArray(arr)) return arr;
}
return [];
}
function stripAcc(s){
try {
return String(s||"")
.toLowerCase()
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "");
} catch (e){
return String(s||"").toLowerCase();
}}
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 formatHora(raw){
if(raw==null||raw==="") return "—";
var s=String(raw).trim();
var m=s.match(/(\d{2}:\d{2})/);
if(m) return m[1];
return s.length >=5 ? s.slice(0, 5):s;
}
function formatMoney(raw){
if(raw==null||raw==="") return "";
var s=String(raw).trim().replace(/R\$\s*/i, "").replace(/\s/g, "");
var n;
if(/,/.test(s)){
n=parseFloat(s.replace(/\./g, "").replace(",", "."));
}else{
n=parseFloat(s);
}
if(!isFinite(n)) return String(raw);
return "R$ " + n.toFixed(2).replace(".", ",");
}
function statusToken(statusRaw){
return resolveReservaStatusBadge(statusRaw).token;
}
function resolveReservaStatusBadge(statusRaw){
var label=statusLabel(statusRaw);
var s=stripAcc(statusRaw);
if(!s) return { token: "confirmada", label: label };
if(s.indexOf("cancel") >=0) return { token: "cancelada", label: label };
if(s.indexOf("recus") >=0||s.indexOf("rejeit") >=0||s.indexOf("negad") >=0){
return { token: "cancelada", label: label };}
if(s.indexOf("conclu") >=0||s.indexOf("finaliz") >=0) return { token: "concluida", label: label };
if(s.indexOf("pend") >=0||s.indexOf("aguard") >=0||s.indexOf("wait") >=0){
return { token: "pendente", label: label };}
if(s.indexOf("aceit") >=0||s.indexOf("aprova") >=0||s.indexOf("confirm") >=0){
return { token: "confirmada", label: label };}
return { token: "confirmada", label: label };}
function isReservaAceita(statusRaw){
return stripAcc(statusRaw).indexOf("aceit") >=0;
}
function isPagamentoAprovado(row){
if(!row||typeof row!=="object") return false;
var pagamentoRaw=pickText(row, [
"pagamento_status",
"status_pagamento",
"payment_status",
"status_pagamento_reserva",
"pagamento_situacao"
]);
var sPay=stripAcc(pagamentoRaw);
if(sPay){
if(sPay.indexOf("aprova") >=0 ||
sPay.indexOf("conclu") >=0 ||
sPay.indexOf("paid") >=0 ||
sPay.indexOf("success") >=0 ||
sPay.indexOf("pago") >=0
){
return true;
}
if(sPay.indexOf("pend") >=0 ||
sPay.indexOf("aguard") >=0 ||
sPay.indexOf("wait") >=0 ||
sPay.indexOf("recus") >=0 ||
sPay.indexOf("cancel") >=0 ||
sPay.indexOf("falh") >=0 ||
sPay.indexOf("negad") >=0
){
return false;
}}
var resultRaw=pickText(row, ["pagamento_result", "payment_result", "resultado_pagamento", "result"]);
var sResult=stripAcc(resultRaw);
if(sResult){
if(sResult==="ok"||sResult.indexOf("aprova") >=0||sResult.indexOf("paid") >=0){
return true;
}}
return false;
}
function resolveReservaStatus(row){
return pickText(row, ["status_reserva", "status", "situacao", "estado", "checking"]);
}
function shouldShowReservaCodigo(row){
var statusReserva=resolveReservaStatus(row);
return isReservaAceita(statusReserva)&&isPagamentoAprovado(row);
}
function statusLabel(statusRaw){
var s=String(statusRaw||"").trim();
if(s) return s.toUpperCase();
return "CONFIRMADA";
}
function resolvePagamentoStatus(row){
var pagamentoRaw=pickText(row, ["pagamento_status", "status_pagamento", "payment_status"]);
var sPay=stripAcc(pagamentoRaw);
if(sPay){
if(sPay.indexOf("aprova") >=0||sPay.indexOf("conclu") >=0||sPay.indexOf("paid") >=0||sPay.indexOf("success") >=0){
return { token: "pago", label: "PAGAMENTO CONCLUÍDO" };}
if(sPay.indexOf("pend") >=0||sPay.indexOf("wait") >=0||sPay.indexOf("process") >=0){
return { token: "pendente", label: "PAGAMENTO PENDENTE" };}}
var reservaRaw=pickText(row, ["status_reserva", "status", "situacao", "estado", "checking"]);
var sRes=stripAcc(reservaRaw);
if(sRes.indexOf("pend") >=0||sRes.indexOf("aguard") >=0||sRes.indexOf("wait") >=0){
return { token: "pendente", label: "PAGAMENTO PENDENTE" };}
if(sRes.indexOf("aceit") >=0||sRes.indexOf("aprova") >=0||sRes.indexOf("conclu") >=0||sRes.indexOf("finaliz") >=0){
return { token: "pago", label: "PAGAMENTO CONCLUÍDO" };}
return { token: statusToken(reservaRaw), label: statusLabel(reservaRaw) };}
function normalizeItem(row){
if(!row||typeof row!=="object") return null;
var suite=pickText(row, ["suite_nome", "nome_suite", "suite", "suite_name", "titulo", "descricao_suite"]);
var img=pick(row, ["imagem", "image_url", "foto", "thumb", "url_imagem", "suite_imagem"]);
if(!img&&Array.isArray(row.imagens)&&row.imagens.length){
var im0=row.imagens[0];
if(typeof im0==="string") img=im0;
else if(im0&&typeof im0==="object") img=im0.image||im0.thumbImage||im0.url||"";
}
if(!img&&row.suite&&typeof row.suite==="object"){
var s=row.suite;
img=pick(s, ["imagem", "image_url", "foto", "thumb", "url_imagem", "suite_imagem"]);
if(!img&&Array.isArray(s.imagens)&&s.imagens.length){
var sim0=s.imagens[0];
if(typeof sim0==="string") img=sim0;
else if(sim0&&typeof sim0==="object") img=sim0.image||sim0.thumbImage||sim0.url||"";
}}
var data=pick(row, ["data", "data_reserva", "dia", "date", "data_inicio"]);
var hora=pick(row, ["hora", "horario", "hora_inicio", "time", "hora_reserva", "chegada_reserva"]);
var valor=pick(row, ["pagamento_valor", "valor_reserva", "valor", "preco", "price", "total", "valor_total"]);
var dur=pick(row, ["periodo_reserva", "duracao", "periodo", "tempo", "duracao_texto", "pacote"]);
var statusData=resolvePagamentoStatus(row);
var durStr=dur ? String(dur).trim():"—";
var priceLine=formatMoney(valor)||"R$ 0,00";
return {
suite: suite ? String(suite):"Suíte",
img: img ? String(img):"",
dataFmt: formatDateBR(data),
horaFmt: formatHora(hora),
periodo: durStr,
valorPago: priceLine,
statusTok: statusData.token,
statusLbl: statusData.label
};}
function firstDetailRecord(api){
if(!api) return null;
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]&&typeof api.data[0]==="object") return api.data[0];
if(api&&typeof api==="object") return api;
return null;
}
function normalizeDetail(row){
if(!row||typeof row!=="object") return null;
var suite=pickText(row, ["suite_nome", "nome_suite", "suite", "suite_name", "titulo", "descricao_suite"]);
var codigo=pickText(row, ["codigo_reserva", "codigo", "codigoPedido"]);
var statusReservaRaw=resolveReservaStatus(row);
var statusBadge=resolveReservaStatusBadge(statusReservaRaw);
var data=pick(row, ["data", "data_reserva", "dia", "date", "data_inicio"]);
var hora=pick(row, ["hora", "horario", "hora_inicio", "time", "hora_reserva", "chegada_reserva"]);
var periodo=pickText(row, ["periodo_reserva", "duracao", "periodo", "tempo", "duracao_texto"]);
var valor=pick(row, ["pagamento_valor", "valor_reserva", "valor", "preco", "price", "total", "valor_total", "transaction_amount"]);
var img=pickText(row, ["imagem", "image_url", "foto", "thumb", "url_imagem", "suite_imagem"]);
if(!img&&Array.isArray(row.imagens)&&row.imagens.length){
var im0=row.imagens[0];
if(typeof im0==="string") img=im0;
else if(im0&&typeof im0==="object") img=String(im0.image||im0.thumbImage||im0.url||"");
}
if(!img&&row.suite&&typeof row.suite==="object"){
img=pickText(row.suite, ["imagem", "image_url", "foto", "thumb", "url_imagem", "suite_imagem"]);
if(!img&&Array.isArray(row.suite.imagens)&&row.suite.imagens.length){
var sim0=row.suite.imagens[0];
if(typeof sim0==="string") img=sim0;
else if(sim0&&typeof sim0==="object") img=String(sim0.image||sim0.thumbImage||sim0.url||"");
}}
var paymentMethodRaw=pickText(row, ["pagamento_metodo", "payment_method_id", "metodo_pagamento", "forma_pagamento", "payment_type_id"]);
function paymentLabel(method){
var m=String(method||"").trim().toLowerCase();
if(!m) return "—";
if(m==="pix") return "Pix";
if(m==="credit_card"||m==="creditcard"||m==="cartao"||m==="cartão") return "Cartão de crédito";
if(m==="debit_card"||m==="debitcard") return "Cartão de débito";
if(m==="ticket"||m==="boleto") return "Boleto";
if(m==="bank_transfer") return "Pix";
return String(method).replace(/_/g, " ");
}
return {
suite: suite||"Suíte",
codigo: codigo||"—",
statusTok: statusBadge.token,
statusLbl: statusBadge.label,
showCodigo: shouldShowReservaCodigo(row),
dataFmt: formatDateBR(data),
horaFmt: formatHora(hora),
periodo: periodo||"—",
valorFmt: formatMoney(valor)||"R$ 0,00",
pagamento: paymentLabel(paymentMethodRaw),
img: img||""
};}
function metaSpan(ctx, iconClass, text){
var span=ctx.el("span", { class: "bdm-reserva-meta-i" });
var ic=document.createElement("i");
ic.className="bdm-fa fa-thin " + iconClass;
ic.setAttribute("aria-hidden", "true");
span.appendChild(ic);
span.appendChild(document.createTextNode(" " + text));
return span;
}
window.BDMChatPages.reservas=function (ctx){
ctx.state.currentView="reservas";
var pages=window.BDMChatPages||{};
var url=(ctx.urls.reservas||"").trim();
function mountShell(emptyMsg){
ctx.loadTemplate("reservas").then(function (html){
var node=ctx.htmlToNode(html);
var slot=node.querySelector('[data-slot="reservas"]');
if(slot&&emptyMsg){
slot.innerHTML="";
slot.appendChild(ctx.el("div", { class: "bdm-empty", text: emptyMsg }));
}
ctx.body.innerHTML="";
ctx.body.appendChild(node);
}).catch(function (){
ctx.body.textContent="Falha ao carregar reservas.";
});
}
if(!pages.isLogged||!pages.isLogged()){
mountShell("Faça login para ver suas reservas.");
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("Lista de reservas não configurada.");
return;
}
Promise.all([
ctx.loadTemplate("reservas"),
fetch(url, {
method: "POST",
credentials: "same-origin",
headers: window.BDMChatPages.mergeWidgetAuthHeaders({ "Content-Type": "application/json" }),
body: JSON.stringify({ id_usuario: uid })
}).then(function (r){ return r.json(); })
])
.then(function (arr){
var html=arr[0];
var data=arr[1];
var node=ctx.htmlToNode(html);
var slot=node.querySelector('[data-slot="reservas"]');
if(!slot){
ctx.body.innerHTML="";
ctx.body.appendChild(node);
return;
}
slot.innerHTML="";
if(data&&data.erro){
slot.appendChild(ctx.el("div", { class: "bdm-empty", text: String(data.erro) }));
ctx.body.innerHTML="";
ctx.body.appendChild(node);
return;
}
var list=normalizeList(data);
if(!list.length){
slot.appendChild(ctx.el("div", { class: "bdm-empty", text: "Você ainda não possui reservas." }));
}else{
list.forEach(function (row){
var it=normalizeItem(row);
if(!it) return;
var card=ctx.el("button", { type: "button", class: "bdm-reserva-card" });
var thumbWrap=ctx.el("div", { class: "bdm-reserva-thumb-wrap" });
if(it.img){
thumbWrap.appendChild(ctx.el("img", {
class: "bdm-reserva-thumb",
src: it.img,
alt: "",
loading: "lazy",
referrerpolicy: "no-referrer"
}));
}else{
thumbWrap.appendChild(ctx.el("div", { class: "bdm-reserva-thumb -placeholder" }));
}
card.appendChild(thumbWrap);
var info=ctx.el("div", { class: "bdm-reserva-info" });
info.appendChild(ctx.el("div", { class: "bdm-reserva-suite", text: it.suite }));
var meta=ctx.el("div", { class: "bdm-reserva-meta" });
meta.appendChild(metaSpan(ctx, "fa-calendar", it.dataFmt));
meta.appendChild(ctx.el("span", { class: "bdm-reserva-meta-sep", "aria-hidden": "true" }));
meta.appendChild(metaSpan(ctx, "fa-clock", it.horaFmt));
info.appendChild(meta);
var extra=ctx.el("div", { class: "bdm-reserva-extra" });
extra.appendChild(ctx.el("div", { class: "bdm-reserva-extra-i" }, [
ctx.el("span", { class: "bdm-reserva-extra-k", text: "Período" }),
ctx.el("b", { class: "bdm-reserva-extra-v", text: it.periodo })
]));
extra.appendChild(ctx.el("div", { class: "bdm-reserva-extra-i" }, [
ctx.el("span", { class: "bdm-reserva-extra-k", text: "Valor" }),
ctx.el("b", { class: "bdm-reserva-extra-v -value", text: it.valorPago })
]));
info.appendChild(extra);
var badge=ctx.el("span", {
class: "bdm-reserva-status -" + it.statusTok,
text: it.statusLbl
});
info.appendChild(badge);
card.appendChild(info);
var chev=ctx.el("span", { class: "bdm-reserva-chev", "aria-hidden": "true" });
chev.innerHTML='<i class="bdm-fa fa-thin fa-chevron-right"></i>';
card.appendChild(chev);
card.addEventListener("click", function (){
ctx.state.selectedReservaRaw=row;
ctx.state.selectedReserva=it;
ctx.navigate("reservaDetalhe");
});
slot.appendChild(card);
});
}
ctx.body.innerHTML="";
ctx.body.appendChild(node);
})
.catch(function (){
ctx.body.textContent="Falha ao carregar suas reservas.";
});
};
window.BDMChatPages.reservaDetalhe=function (ctx){
ctx.state.currentView="reservaDetalhe";
var pages=window.BDMChatPages||{};
var uid=pages.getUsuarioId ? pages.getUsuarioId():0;
var url=(ctx.urls.reservaDetalhe||"").trim();
var raw=ctx.state.selectedReservaRaw||ctx.state.lastReservaPaymentData||{};
var codigo=pickText(raw, ["codigo_reserva", "codigo", "codigoPedido"]);
if(!uid||!codigo||!url){
ctx.body.textContent="Detalhes da reserva indisponíveis.";
return;
}
ctx.loadTemplate("reserva-detalhe")
.then(function (html){
return fetch(url, {
method: "POST",
credentials: "same-origin",
headers: window.BDMChatPages.mergeWidgetAuthHeaders({ "Content-Type": "application/json" }),
body: JSON.stringify({ id_usuario: uid, codigo_reserva: codigo })
}).then(function (r){ return r.json(); }).then(function (api){ return { html: html, api: api };});
})
.then(function (pack){
var row=firstDetailRecord(pack.api)||raw||{};
var detail=normalizeDetail(row)||{
suite: "Suíte",
codigo: codigo,
statusTok: "confirmada",
statusLbl: "—",
showCodigo: false,
dataFmt: "—",
horaFmt: "—",
periodo: "—",
valorFmt: "R$ 0,00",
pagamento: "—",
img: ""
};
var model=window.BDMChatMotelModel||{};
var motelNode=model&&model.motel&&typeof model.motel==="object" ? model.motel:model;
var chat=window.motelswingChat||{};
var googleUrl=pickText(row, ["google", "maps", "google_maps"])
|| pickText(motelNode, ["google", "maps", "google_maps"])
|| String(chat.googleMapsUrl||"").trim();
var wazeUrl=pickText(row, ["waze"])
|| pickText(motelNode, ["waze"])
|| String(chat.wazeUrl||"").trim();
var endereco=pickText(row, ["endereco", "endereco_motel"])
|| pickText(motelNode, ["endereco"])
|| String(chat.motelEndereco||"").trim();
var node=ctx.htmlToNode(pack.html);
var setText=function (slot, value){
var el=node.querySelector('[data-slot="' + slot + '"]');
if(el) el.textContent=value;
};
setText("detalhe-suite", detail.suite);
var statusSlot=node.querySelector('[data-slot="detalhe-status"]');
if(statusSlot){
statusSlot.textContent="";
statusSlot.appendChild(ctx.el("span", {
class: "bdm-reserva-status -" + (detail.statusTok||"confirmada"),
text: detail.statusLbl||"—"
}));
}
var codeEl=node.querySelector('[data-slot="detalhe-codigo"]');
if(codeEl){
if(detail.showCodigo&&detail.codigo&&detail.codigo!=="—"){
codeEl.textContent=detail.codigo;
codeEl.removeAttribute("hidden");
}else{
codeEl.textContent="";
codeEl.setAttribute("hidden", "hidden");
}}
setText("detalhe-data", detail.dataFmt);
setText("detalhe-hora", detail.horaFmt);
setText("detalhe-periodo", detail.periodo);
setText("detalhe-valor", detail.valorFmt);
setText("detalhe-pagamento", detail.pagamento);
if(endereco){
setText("detalhe-endereco", endereco);
var enderecoRow=node.querySelector('[data-slot="detalhe-endereco-row"]');
if(enderecoRow) enderecoRow.removeAttribute("hidden");
}
var img=node.querySelector('[data-slot="detalhe-img"]');
if(img){
if(detail.img){
img.setAttribute("src", detail.img);
img.removeAttribute("hidden");
}else{
img.setAttribute("hidden", "hidden");
}}
var g=node.querySelector('[data-slot="detalhe-google"]');
var w=node.querySelector('[data-slot="detalhe-waze"]');
if(g){
if(googleUrl) g.setAttribute("href", googleUrl);
else g.setAttribute("hidden", "hidden");
}
if(w){
if(wazeUrl) w.setAttribute("href", wazeUrl);
else w.setAttribute("hidden", "hidden");
}
ctx.body.innerHTML="";
ctx.body.appendChild(node);
})
.catch(function (){
ctx.body.textContent="Falha ao carregar detalhes da reserva.";
});
};})();