{"id":2,"date":"2025-11-25T15:52:09","date_gmt":"2025-11-25T18:52:09","guid":{"rendered":"https:\/\/agisa.com.br\/bonus.agisa.com.br\/?page_id=2"},"modified":"2026-01-15T08:31:12","modified_gmt":"2026-01-15T11:31:12","slug":"area-do-cliente","status":"publish","type":"page","link":"https:\/\/agisa.com.br\/bonus.agisa.com.br\/area-do-cliente\/","title":{"rendered":"\u00c1REA DO CLIENTE"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2\" class=\"elementor elementor-2\">\n\t\t\t\t<div class=\"elementor-element elementor-element-299a24f e-flex e-con-boxed e-con e-parent\" data-id=\"299a24f\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e4c66ab elementor-widget elementor-widget-html\" data-id=\"e4c66ab\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"pt-BR\">\r\n<head>\r\n  <meta charset=\"UTF-8\" \/>\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\r\n  <title>AGISA | \u00c1rea do Cliente<\/title>\r\n\r\n  <script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\r\n\r\n  <!-- Firebase v8 -->\r\n  <script src=\"https:\/\/www.gstatic.com\/firebasejs\/8.10.0\/firebase-app.js\"><\/script>\r\n  <script src=\"https:\/\/www.gstatic.com\/firebasejs\/8.10.0\/firebase-auth.js\"><\/script>\r\n  <script src=\"https:\/\/www.gstatic.com\/firebasejs\/8.10.0\/firebase-firestore.js\"><\/script>\r\n\r\n  <style>\r\n    :root{ --ag-yellow:#FFD400; --ag-black:#050505; --ag-gray:#1A1A1A; }\r\n    body{ background:var(--ag-black); color:#f5f5f5; font-family:Inter,Arial,sans-serif; }\r\n    .ag-card{ background:var(--ag-gray); border:1px solid rgba(255,212,0,.35); }\r\n    .ag-input{ background:#000; border:1px solid #333; padding:12px; border-radius:10px; color:#fff; width:100%; }\r\n    .ag-btn{ background:var(--ag-yellow); color:#000; font-weight:900; padding:12px; border-radius:12px; width:100%; }\r\n    .hidden{ display:none; }\r\n\r\n    .pesq-card{ background:#141414; border:1px solid rgba(255,212,0,.22); border-radius:12px; padding:12px; }\r\n    .pesq-title{ font-weight:800; font-size:14px; line-height:1.2; margin-bottom:8px; }\r\n    .pesq-opt{ font-size:12px; color:#e7e7e7; display:flex; align-items:flex-start; gap:8px; }\r\n    .pesq-opt input{ transform:scale(.95); margin-top:2px; }\r\n\r\n    .toast { position:fixed; bottom:18px; left:50%; transform:translateX(-50%);\r\n      background:#0b0b0b; border:1px solid rgba(255,212,0,.35); padding:10px 12px;\r\n      border-radius:12px; font-size:12px; max-width:92vw; z-index:9999; }\r\n\r\n    .link-btn{\r\n      width:100%;\r\n      margin-top:8px;\r\n      padding:10px 12px;\r\n      border-radius:12px;\r\n      border:1px solid rgba(255,255,255,.12);\r\n      background:rgba(255,255,255,.03);\r\n      font-size:12px;\r\n      color:#eaeaea;\r\n      transition:.15s;\r\n    }\r\n    .link-btn:hover{ background:rgba(255,255,255,.06); }\r\n\r\n    .ag-chip{\r\n      display:inline-flex; align-items:center; gap:6px;\r\n      padding:6px 10px; border-radius:999px;\r\n      border:1px solid rgba(255,255,255,.10);\r\n      background:rgba(255,255,255,.03);\r\n      font-size:11px; color:#eaeaea;\r\n      white-space:nowrap;\r\n    }\r\n\r\n    .ag-mini-btn{\r\n      padding:6px 10px;\r\n      border-radius:10px;\r\n      border:1px solid rgba(255,212,0,.35);\r\n      background:rgba(255,212,0,.10);\r\n      color:#ffd400;\r\n      font-weight:800;\r\n      font-size:12px;\r\n      transition:.15s;\r\n    }\r\n    .ag-mini-btn:hover{ background:rgba(255,212,0,.16); }\r\n\r\n    \/* ====== MODAL POL\u00cdTICA (MELHORADO) ====== *\/\r\n    .ag-modal-shell{\r\n      background: radial-gradient(900px 400px at 20% 0%, rgba(255,212,0,.10), transparent 60%),\r\n                  radial-gradient(900px 400px at 85% 20%, rgba(255,212,0,.06), transparent 55%),\r\n                  #070707;\r\n      border: 1px solid rgba(255,212,0,.32);\r\n      box-shadow: 0 20px 80px rgba(0,0,0,.75);\r\n    }\r\n    .ag-modal-title{\r\n      letter-spacing: .2px;\r\n      text-shadow: 0 0 18px rgba(255,212,0,.18);\r\n    }\r\n    .ag-scroll{\r\n      scrollbar-width: thin;\r\n      scrollbar-color: rgba(255,212,0,.35) rgba(255,255,255,.06);\r\n    }\r\n    .ag-scroll::-webkit-scrollbar{ width:10px; }\r\n    .ag-scroll::-webkit-scrollbar-track{ background:rgba(255,255,255,.06); border-radius:999px; }\r\n    .ag-scroll::-webkit-scrollbar-thumb{ background:rgba(255,212,0,.32); border-radius:999px; border:2px solid rgba(255,255,255,.06); }\r\n    .ag-scroll::-webkit-scrollbar-thumb:hover{ background:rgba(255,212,0,.42); }\r\n\r\n    .ag-policy-card{\r\n      background: linear-gradient(180deg, rgba(255,255,255,.04), rgba(255,255,255,.02));\r\n      border: 1px solid rgba(255,255,255,.10);\r\n    }\r\n\r\n    .ag-side-card{\r\n      background: linear-gradient(180deg, rgba(255,212,0,.10), rgba(0,0,0,.25));\r\n      border: 1px solid rgba(255,212,0,.25);\r\n    }\r\n\r\n    .ag-soft{\r\n      background: rgba(255,255,255,.03);\r\n      border: 1px solid rgba(255,255,255,.10);\r\n    }\r\n  <\/style>\r\n<\/head>\r\n\r\n<body>\r\n\r\n<header class=\"px-4 sm:px-6 py-4 border-b border-yellow-400\">\r\n  <div class=\"flex items-center justify-between flex-wrap gap-4 max-w-5xl mx-auto\">\r\n    <h1 class=\"text-xl sm:text-2xl font-extrabold\">\r\n      <span class=\"text-yellow-400\">AGISA<\/span> \u00c1rea do Cliente\r\n    <\/h1>\r\n    <div class=\"flex items-center gap-3 text-xs sm:text-sm\">\r\n      <span id=\"authStatus\" class=\"text-gray-300\">Carregando...<\/span>\r\n      <button id=\"btnLogout\" class=\"hidden px-3 py-2 rounded-lg border border-yellow-400\/40 hover:bg-yellow-400\/10 transition\">\r\n        Sair\r\n      <\/button>\r\n    <\/div>\r\n  <\/div>\r\n<\/header>\r\n\r\n<main class=\"p-4 sm:p-6 max-w-5xl mx-auto space-y-8\">\r\n\r\n  <!-- \u2705 AUTH -->\r\n  <section id=\"authView\" class=\"ag-card p-5 sm:p-6 rounded-2xl\">\r\n    <h2 class=\"text-base sm:text-lg font-bold text-yellow-400 mb-4\">Acesso do Cliente<\/h2>\r\n\r\n    <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n\r\n      <!-- LOGIN -->\r\n      <div id=\"loginCard\" class=\"bg-black\/40 border border-white\/10 rounded-2xl p-4\">\r\n        <div class=\"font-extrabold text-yellow-300 mb-3\">Entrar<\/div>\r\n        <div class=\"space-y-3\">\r\n          <div>\r\n            <label class=\"text-xs text-gray-400\">E-mail<\/label>\r\n            <input id=\"loginEmail\" class=\"ag-input\" placeholder=\"email@empresa.com\" autocomplete=\"username\" \/>\r\n          <\/div>\r\n          <div>\r\n            <label class=\"text-xs text-gray-400\">Senha<\/label>\r\n            <input id=\"loginSenha\" class=\"ag-input\" type=\"password\" placeholder=\"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\" autocomplete=\"current-password\" \/>\r\n          <\/div>\r\n\r\n          <button id=\"btnLogin\" class=\"ag-btn\">ENTRAR<\/button>\r\n\r\n          <button id=\"btnResetSenha\" class=\"link-btn\">Esqueci minha senha<\/button>\r\n\r\n          <button id=\"btnAbrirCadastro\" class=\"link-btn\" style=\"border-color: rgba(255,212,0,.35);\">\r\n            Criar conta\r\n          <\/button>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- CADASTRO -->\r\n      <div id=\"cadastroCard\" class=\"bg-black\/40 border border-white\/10 rounded-2xl p-4\">\r\n        <div class=\"font-extrabold text-yellow-300 mb-3\">Criar cadastro<\/div>\r\n\r\n        <div class=\"space-y-3\">\r\n          <div>\r\n            <label class=\"text-xs text-gray-400\">CNPJ (vai ficar vinculado ao seu login)<\/label>\r\n            <input id=\"cadCnpj\" class=\"ag-input\" placeholder=\"00.000.000\/0000-00\" autocomplete=\"off\" \/>\r\n          <\/div>\r\n          <div>\r\n            <label class=\"text-xs text-gray-400\">E-mail<\/label>\r\n            <input id=\"cadEmail\" class=\"ag-input\" placeholder=\"email@empresa.com\" autocomplete=\"email\" \/>\r\n          <\/div>\r\n          <div>\r\n            <label class=\"text-xs text-gray-400\">Senha<\/label>\r\n            <input id=\"cadSenha1\" class=\"ag-input\" type=\"password\" placeholder=\"m\u00ednimo 6 caracteres\" autocomplete=\"new-password\" \/>\r\n          <\/div>\r\n          <div>\r\n            <label class=\"text-xs text-gray-400\">Repetir senha<\/label>\r\n            <input id=\"cadSenha2\" class=\"ag-input\" type=\"password\" placeholder=\"repita a senha\" autocomplete=\"new-password\" \/>\r\n          <\/div>\r\n\r\n          <button id=\"btnCadastrar\" class=\"ag-btn\">CADASTRAR<\/button>\r\n\r\n          <button id=\"btnVoltarLogin\" class=\"link-btn\">J\u00e1 tenho conta<\/button>\r\n        <\/div>\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n    <div id=\"authMsg\" class=\"hidden mt-4 text-sm p-3 rounded-lg border\"><\/div>\r\n  <\/section>\r\n\r\n  <!-- \u2705 CONTE\u00daDO (s\u00f3 logado) -->\r\n  <section id=\"conteudoView\" class=\"hidden space-y-8\">\r\n\r\n    <!-- CONSULTA -->\r\n    <section class=\"ag-card p-5 sm:p-6 rounded-2xl\">\r\n      <h2 class=\"text-base sm:text-lg font-bold text-yellow-400 mb-4\">Consultar meus b\u00f4nus<\/h2>\r\n\r\n      <div class=\"grid grid-cols-1 md:grid-cols-3 gap-3 items-end\">\r\n        <div class=\"md:col-span-2\">\r\n          <label class=\"text-xs text-gray-400\">CNPJ<\/label>\r\n          <input id=\"cCnpj\" class=\"ag-input\" placeholder=\"Digite seu CNPJ\" \/>\r\n          <p id=\"cnpjHint\" class=\"text-[11px] text-gray-500 mt-1\">\r\n            Carregando seu CNPJ...\r\n          <\/p>\r\n\r\n          <div id=\"blocoVincularCnpj\" class=\"hidden mt-2\">\r\n            <button id=\"btnVincularCnpj\" class=\"link-btn\" style=\"border-color: rgba(255,212,0,.35);\">\r\n              VINCULAR CNPJ AO MEU LOGIN\r\n            <\/button>\r\n            <p class=\"text-[11px] text-gray-500 mt-1\">\r\n              Isso evita ter que digitar toda vez.\r\n            <\/p>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div>\r\n          <button class=\"ag-btn\" onclick=\"consultarCarteira()\">CONSULTAR<\/button>\r\n        <\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- PAINEL \/ CARTEIRA -->\r\n    <section id=\"painelCliente\" class=\"hidden space-y-8\">\r\n\r\n      <!-- SALDOS -->\r\n      <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n        <div class=\"ag-card p-4 text-center rounded-2xl\">\r\n          <div class=\"text-xs text-gray-400\">Saldo Dispon\u00edvel<\/div>\r\n          <div id=\"kSaldo\" class=\"text-xl font-extrabold text-green-400\">R$ 0,00<\/div>\r\n        <\/div>\r\n        <div class=\"ag-card p-4 text-center rounded-2xl\">\r\n          <div class=\"text-xs text-gray-400\">A Desbloquear<\/div>\r\n          <div id=\"kBloquear\" class=\"text-xl font-extrabold text-orange-400\">R$ 0,00<\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- \u2705 NOVO: HIST\u00d3RICO DE RECEBIMENTOS -->\r\n      <div class=\"ag-card p-5 sm:p-6 rounded-2xl overflow-x-auto\">\r\n        <div class=\"flex items-center justify-between gap-3 flex-wrap mb-4\">\r\n          <h3 class=\"text-yellow-400 font-bold\">Hist\u00f3rico de recebimentos<\/h3>\r\n          <div class=\"flex items-center gap-2 flex-wrap\">\r\n            <span id=\"recebCount\" class=\"ag-chip\">0 entradas<\/span>\r\n            <button class=\"ag-mini-btn\" onclick=\"carregarHistoricoRecebimentos()\">ATUALIZAR<\/button>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <table class=\"min-w-full text-sm\">\r\n          <thead class=\"border-b border-gray-700 text-gray-400\">\r\n            <tr>\r\n              <th class=\"py-2 text-left\">Cliente<\/th>\r\n              <th class=\"py-2 text-left\">CNPJ<\/th>\r\n              <th class=\"py-2 text-left\">Contrato<\/th>\r\n              <th class=\"py-2 text-left\">Data<\/th>\r\n              <th class=\"py-2 text-left\">Valor contrato<\/th>\r\n              <th class=\"py-2 text-left\">%<\/th>\r\n              <th class=\"py-2 text-left\">Recebido<\/th>\r\n              <th class=\"py-2 text-left\">Recibo<\/th>\r\n            <\/tr>\r\n          <\/thead>\r\n          <tbody id=\"listaRecebimentos\"><\/tbody>\r\n        <\/table>\r\n\r\n        <p class=\"text-[11px] text-gray-500 mt-2\">\r\n          Aqui aparecem apenas pagamentos com status <b>PAGO<\/b> (entradas na sua carteira).\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <!-- CONTRATOS INFORMATIVOS -->\r\n      <div class=\"ag-card p-5 sm:p-6 rounded-2xl\">\r\n        <button onclick=\"toggleContratos()\" class=\"w-full flex justify-between items-center text-yellow-400 font-bold\">\r\n          <span>\ud83d\udcc2 Consulte aqui os seus contratos<\/span>\r\n          <span id=\"iconeSeta\" class=\"text-xl\">\u25bc<\/span>\r\n        <\/button>\r\n\r\n        <div id=\"blocoContratosInfo\" class=\"hidden mt-4\">\r\n          <ul id=\"listaContratosInfo\" class=\"space-y-2 text-sm\"><\/ul>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- USO DO SALDO -->\r\n      <div class=\"ag-card p-5 sm:p-6 rounded-2xl\">\r\n        <h3 class=\"text-yellow-400 font-bold mb-4\">Usar meu b\u00f4nus<\/h3>\r\n\r\n        <div class=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n          <input id=\"uValor\" type=\"number\" class=\"ag-input\" placeholder=\"Valor a usar\" \/>\r\n          <input id=\"uToken\" class=\"ag-input\" placeholder=\"Token\" \/>\r\n          <input id=\"uNovoContrato\" class=\"ag-input\" placeholder=\"N\u00famero do novo contrato\" \/>\r\n        <\/div>\r\n\r\n        <button class=\"ag-btn mt-4\" onclick=\"abrirPesquisaAntesDeUsarSaldo()\">UTILIZAR SALDO<\/button>\r\n        <p class=\"text-xs text-gray-400 mt-2\">\r\n          Para utilizar o saldo, \u00e9 obrigat\u00f3rio responder a Pesquisa de Satisfa\u00e7\u00e3o.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <!-- HIST\u00d3RICO DE USO -->\r\n      <div class=\"ag-card p-5 sm:p-6 rounded-2xl overflow-x-auto\">\r\n        <h3 class=\"text-yellow-400 font-bold mb-4\">Hist\u00f3rico de uso<\/h3>\r\n        <table class=\"min-w-full text-sm\">\r\n          <thead class=\"border-b border-gray-700 text-gray-400\">\r\n            <tr>\r\n              <th class=\"py-2 text-left\">Valor<\/th>\r\n              <th class=\"py-2 text-left\">Contrato<\/th>\r\n              <th class=\"py-2 text-left\">Data<\/th>\r\n            <\/tr>\r\n          <\/thead>\r\n          <tbody id=\"listaUso\"><\/tbody>\r\n        <\/table>\r\n      <\/div>\r\n\r\n    <\/section>\r\n  <\/section>\r\n\r\n<\/main>\r\n\r\n<!-- \u2705 MODAL PESQUISA -->\r\n<div id=\"modalPesquisa\" class=\"fixed inset-0 bg-black\/70 hidden items-center justify-center z-50 p-3\">\r\n  <div class=\"bg-[#0b0b0b] text-white rounded-2xl w-full max-w-3xl relative border border-yellow-400\/40\">\r\n    <button onclick=\"fecharPesquisa()\" class=\"absolute top-3 right-4 text-xl text-gray-200\">\u2715<\/button>\r\n\r\n    <div class=\"px-5 pt-5 pb-3 border-b border-yellow-400\/15\">\r\n      <h2 class=\"text-base md:text-lg font-extrabold text-yellow-300 leading-tight\">\r\n        Pesquisa de Satisfa\u00e7\u00e3o - Agisa Containers\r\n      <\/h2>\r\n      <p class=\"text-[11px] text-gray-400 mt-1\">\r\n        Responda todas as perguntas para liberar o uso do b\u00f4nus.\r\n      <\/p>\r\n    <\/div>\r\n\r\n    <div class=\"px-5 pb-5 pt-4\" style=\"max-height:80vh; overflow-y:auto;\">\r\n      <form id=\"formPesquisa\" class=\"space-y-3\">\r\n\r\n        <div class=\"pesq-card\">\r\n          <div class=\"pesq-title\">1. Condi\u00e7\u00e3o f\u00edsica do container (pintura, estrutura e veda\u00e7\u00e3o)<\/div>\r\n          <div class=\"grid grid-cols-1 md:grid-cols-2 gap-2\">\r\n            <label class=\"pesq-opt\"><input type=\"radio\" name=\"q1\" value=\"Excelente\" \/> Excelente: Superou as expectativas.<\/label>\r\n            <label class=\"pesq-opt\"><input type=\"radio\" name=\"q1\" value=\"Bom\" \/> Bom: Est\u00e1 em \u00f3timo estado.<\/label>\r\n            <label class=\"pesq-opt\"><input type=\"radio\" name=\"q1\" value=\"Regular\" \/> Regular: Atende, mas tem marcas de uso.<\/label>\r\n            <label class=\"pesq-opt\"><input type=\"radio\" name=\"q1\" value=\"Ruim\" \/> Ruim: Apresentou problemas t\u00e9cnicos.<\/label>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"pesq-card\">\r\n          <div class=\"pesq-title\">2. Prazo e log\u00edstica de entrega<\/div>\r\n          <div class=\"grid grid-cols-1 md:grid-cols-2 gap-2\">\r\n            <label class=\"pesq-opt\"><input type=\"radio\" name=\"q2\" value=\"Muito \u00e1gil\" \/> Muito \u00e1gil: Chegou no prazo ou antes.<\/label>\r\n            <label class=\"pesq-opt\"><input type=\"radio\" name=\"q2\" value=\"Satisfeito\" \/> Satisfeito: Prazo cumprido no esperado.<\/label>\r\n            <label class=\"pesq-opt\"><input type=\"radio\" name=\"q2\" value=\"Regular\" \/> Regular: Pequeno atraso, mas informado.<\/label>\r\n            <label class=\"pesq-opt\"><input type=\"radio\" name=\"q2\" value=\"Insatisfeito\" \/> Insatisfeito: Demorou muito mais.<\/label>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"pesq-card\">\r\n          <div class=\"pesq-title\">3. Fator determinante para fechar neg\u00f3cio<\/div>\r\n          <div class=\"grid grid-cols-1 md:grid-cols-2 gap-2\">\r\n            <label class=\"pesq-opt\"><input type=\"radio\" name=\"q3\" value=\"Confian\u00e7a\/Credibilidade\" \/> Confian\u00e7a\/Credibilidade (indica\u00e7\u00e3o\/marca).<\/label>\r\n            <label class=\"pesq-opt\"><input type=\"radio\" name=\"q3\" value=\"Custo-benef\u00edcio\" \/> Custo-benef\u00edcio (pre\u00e7o e qualidade).<\/label>\r\n            <label class=\"pesq-opt\"><input type=\"radio\" name=\"q3\" value=\"Atendimento\" \/> Atendimento (consultoria t\u00e9cnica).<\/label>\r\n            <label class=\"pesq-opt\"><input type=\"radio\" name=\"q3\" value=\"Disponibilidade\" \/> Disponibilidade (pronta entrega).<\/label>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"pesq-card\">\r\n          <div class=\"pesq-title\">4. Por qual canal conheceu a Agisa Containers?<\/div>\r\n          <div class=\"grid grid-cols-1 md:grid-cols-2 gap-2\">\r\n            <label class=\"pesq-opt\"><input type=\"radio\" name=\"q4\" value=\"Google\" \/> Google (Pesquisa\/An\u00fancios).<\/label>\r\n            <label class=\"pesq-opt\"><input type=\"radio\" name=\"q4\" value=\"Redes Sociais\" \/> Redes Sociais (Instagram\/Facebook\/LinkedIn).<\/label>\r\n            <label class=\"pesq-opt\"><input type=\"radio\" name=\"q4\" value=\"Indica\u00e7\u00e3o\" \/> Indica\u00e7\u00e3o de amigos\/parceiros.<\/label>\r\n            <label class=\"pesq-opt\"><input type=\"radio\" name=\"q4\" value=\"J\u00e1 sou cliente\" \/> J\u00e1 sou cliente.<\/label>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div id=\"pesqErro\" class=\"text-xs text-red-400 hidden\"><\/div>\r\n\r\n        <div class=\"flex flex-col md:flex-row gap-2 pt-1\">\r\n          <button type=\"button\" class=\"ag-btn\" onclick=\"enviarPesquisaEUsarSaldo()\">ENVIAR E UTILIZAR SALDO<\/button>\r\n          <button type=\"button\" class=\"ag-btn\" style=\"background:#222;color:#fff;border:1px solid #444\" onclick=\"fecharPesquisa()\">CANCELAR<\/button>\r\n        <\/div>\r\n\r\n      <\/form>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- \u2705 MODAL POL\u00cdTICA (LAYOUT + ROLAGEM MELHORADOS) -->\r\n<div id=\"modalPolitica\" class=\"fixed inset-0 bg-black\/80 hidden items-center justify-center z-[60] p-3\">\r\n  <div class=\"ag-modal-shell text-white rounded-3xl w-full max-w-6xl relative overflow-hidden\">\r\n    <div class=\"px-5 sm:px-8 pt-6 pb-4 border-b border-yellow-400\/15\">\r\n      <div class=\"flex items-start justify-between gap-3\">\r\n        <div>\r\n          <h2 class=\"ag-modal-title text-base sm:text-lg md:text-xl font-extrabold text-yellow-300 leading-tight\">\r\n            Pol\u00edtica de Utiliza\u00e7\u00e3o de B\u00f4nus <span class=\"text-yellow-300\/70 font-black\">(Programa Giftback AGISA)<\/span>\r\n          <\/h2>\r\n          <p class=\"text-[11px] sm:text-xs text-gray-400 mt-1\">\r\n            Para continuar, \u00e9 obrigat\u00f3rio ler at\u00e9 o fim e aceitar a pol\u00edtica (1 aceite por CNPJ).\r\n          <\/p>\r\n        <\/div>\r\n\r\n        <button id=\"btnSairPoliticaTopo\" class=\"hidden sm:inline-flex items-center gap-2 px-3 py-2 rounded-xl border border-white\/10 bg-white\/5 hover:bg-white\/10 transition text-xs\">\r\n          Sair\r\n        <\/button>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"px-5 sm:px-8 pb-6 pt-5 grid grid-cols-1 lg:grid-cols-12 gap-5\">\r\n      <!-- TEXTO -->\r\n      <div class=\"lg:col-span-7 xl:col-span-8\">\r\n        <div class=\"ag-policy-card rounded-2xl p-4 sm:p-5\">\r\n          <!-- rolagem REAL -->\r\n          <div class=\"ag-scroll pr-2 sm:pr-3\" style=\"max-height:62vh; overflow-y:auto;\">\r\n            <div class=\"text-[12px] sm:text-[13px] leading-relaxed text-gray-100 whitespace-pre-wrap\" id=\"politicaTexto\"><\/div>\r\n          <\/div>\r\n\r\n          <div class=\"mt-4 flex items-start gap-3 p-3 rounded-2xl ag-soft\">\r\n            <input id=\"chkAceitePolitica\" type=\"checkbox\" class=\"mt-1 scale-110\" \/>\r\n            <label for=\"chkAceitePolitica\" class=\"text-[12px] sm:text-[13px] text-gray-200\">\r\n              Eu li e concordo integralmente com a <b class=\"text-yellow-300\">Pol\u00edtica de Utiliza\u00e7\u00e3o de B\u00f4nus<\/b>.\r\n            <\/label>\r\n          <\/div>\r\n\r\n          <div id=\"politicaErro\" class=\"hidden mt-3 text-xs text-red-400\"><\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- DADOS RESPONS\u00c1VEL -->\r\n      <div class=\"lg:col-span-5 xl:col-span-4\">\r\n        <div class=\"ag-side-card rounded-2xl p-4 sm:p-5\">\r\n          <div class=\"flex items-center justify-between mb-3\">\r\n            <div class=\"text-yellow-300 font-extrabold text-sm\">Dados do respons\u00e1vel<\/div>\r\n            <span class=\"text-[11px] px-2 py-1 rounded-full border border-yellow-400\/25 bg-yellow-400\/10 text-yellow-200\">\r\n              obrigat\u00f3rio\r\n            <\/span>\r\n          <\/div>\r\n\r\n          <div class=\"space-y-3\">\r\n            <div>\r\n              <label class=\"text-xs text-gray-300\">Nome do respons\u00e1vel<\/label>\r\n              <input id=\"respNome\" class=\"ag-input\" placeholder=\"Nome completo\" autocomplete=\"name\" \/>\r\n            <\/div>\r\n\r\n            <div>\r\n              <label class=\"text-xs text-gray-300\">CPF do respons\u00e1vel<\/label>\r\n              <input id=\"respCpf\" class=\"ag-input\" placeholder=\"000.000.000-00\" inputmode=\"numeric\" \/>\r\n              <p class=\"text-[11px] text-gray-400 mt-1\">\r\n                Ser\u00e1 registrado junto ao aceite para auditoria interna.\r\n              <\/p>\r\n            <\/div>\r\n\r\n            <button id=\"btnAceitarPolitica\" class=\"ag-btn\">ACEITAR E CONTINUAR<\/button>\r\n\r\n            <button id=\"btnSairPolitica\" class=\"link-btn\" style=\"border-color: rgba(255,255,255,.18);\">\r\n              SAIR\r\n            <\/button>\r\n\r\n            <div class=\"mt-1 grid grid-cols-1 gap-2\">\r\n              <div class=\"ag-soft rounded-2xl p-3\">\r\n                <div class=\"text-[11px] text-gray-400\">\r\n                  CNPJ detectado:\r\n                  <span id=\"politicaCnpjLabel\" class=\"text-yellow-300 font-extrabold\">-<\/span>\r\n                <\/div>\r\n                <div class=\"text-[11px] text-gray-400 mt-1\">\r\n                  Vers\u00e3o da pol\u00edtica:\r\n                  <span id=\"politicaVersaoLabel\" class=\"text-yellow-300 font-extrabold\">2026-01<\/span>\r\n                <\/div>\r\n              <\/div>\r\n\r\n              <div class=\"text-[11px] text-gray-500 leading-snug\">\r\n                Se voc\u00ea n\u00e3o aceitar, n\u00e3o ser\u00e1 poss\u00edvel usar a \u00c1rea do Cliente.\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <p class=\"text-[10px] text-gray-500 mt-3\">\r\n          Dica: role o texto at\u00e9 o final para revisar todas as condi\u00e7\u00f5es.\r\n        <\/p>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<div id=\"toast\" class=\"toast hidden\"><\/div>\r\n\r\n<script>\r\n\/* ===============================\r\n   \u2705 FIREBASE INIT\r\n   =============================== *\/\r\nfirebase.initializeApp({\r\n  apiKey:\"AIzaSyDlk2mb_k97TmVxjMjIScx6JW2R3R9h0hA\",\r\n  authDomain:\"agisa-containners-ltda.firebaseapp.com\",\r\n  projectId:\"agisa-containners-ltda\"\r\n});\r\n\r\nconst auth = firebase.auth();\r\nconst db   = firebase.firestore();\r\n\r\n\/* ===============================\r\n   \u2705 CONFIG\r\n   =============================== *\/\r\nconst CADASTRO_CLIENTE_COLLECTION = \"cadastro_cliente_base\";\r\nconst SATISFACAO_COLLECTION = \"satisfacao\";\r\nconst SALDO_VALIDADE_DIAS_FALLBACK = 365;\r\nconst TOKEN_VALIDADE_DIAS_FALLBACK = 7;\r\nconst CASHBACK_PERCENT_PADRAO = 5;\r\n\r\n\/* ===============================\r\n   \u2705 POL\u00cdTICA\r\n   =============================== *\/\r\nconst POLITICA_COLLECTION = \"politica_utilizacao\";\r\nconst POLITICA_VERSAO = \"2026-01\";\r\n\r\n\/* (texto completo do termo) *\/\r\nconst POLITICA_TEXTO = `POL\u00cdTICA DE UTILIZA\u00c7\u00c3O DE B\u00d4NUS\r\n\r\nPROGRAMA GIFTBACK AGISA\r\n\r\nAGISA CONTAINERS LTDA\r\nAGISA SOLU\u00c7\u00d5ES MODULARES\r\n\r\n1. OBJETO\r\n\r\nA presente Pol\u00edtica de Utiliza\u00e7\u00e3o de B\u00f4nus tem como objetivo estabelecer as regras e condi\u00e7\u00f5es para a participa\u00e7\u00e3o no Programa Giftback Agisa, um programa de fidelidade e incentivo oferecido pelas empresas Agisa Containers Ltda e Agisa Solu\u00e7\u00f5es Modulares aos seus Clientes, visando recompensar a adimpl\u00eancia e a continuidade dos neg\u00f3cios.\r\n\r\n2. EMPRESAS PARTICIPANTES\r\n\r\nO Programa Giftback Agisa \u00e9 oferecido pelas seguintes empresas, doravante denominadas \u201cAgisa\u201d:\r\n\r\nAgisa Containers Ltda - CNPJ: [__________________]\r\nAgisa Solu\u00e7\u00f5es Modulares - CNPJ: [__________________]\r\n\r\n3. DEFINI\u00c7\u00d5ES\r\n\r\nPara os fins desta Pol\u00edtica, os termos abaixo ter\u00e3o os seguintes significados:\r\n\r\nB\u00f4nus ou Giftback: Cr\u00e9dito concedido ao Cliente, equivalente a 5% (cinco por cento) do valor bruto de loca\u00e7\u00f5es eleg\u00edveis, para ser utilizado em Novos Contratos.\r\nCliente: Pessoa jur\u00eddica que possui contrato de loca\u00e7\u00e3o ativo com a Agisa e que cumpre os requisitos de elegibilidade do Programa.\r\nContrato Vigente: Contrato de loca\u00e7\u00e3o ativo entre o Cliente e a Agisa no momento da gera\u00e7\u00e3o do B\u00f4nus.\r\nNovo Contrato: Novo contrato de loca\u00e7\u00e3o firmado entre o Cliente e a Agisa ap\u00f3s a gera\u00e7\u00e3o do B\u00f4nus, no qual o B\u00f4nus poder\u00e1 ser aplicado.\r\nFatura Eleg\u00edvel: Fatura de loca\u00e7\u00e3o paga em dia e cujo valor do cr\u00e9dito tenha sido devidamente confirmado na conta corrente das locadoras.\r\n\u00c1rea do Cliente: Plataforma online disponibilizada pela Agisa para que o Cliente possa consultar seu Saldo de B\u00f4nus, hist\u00f3rico e gerenciar informa\u00e7\u00f5es relacionadas ao Programa.\r\nToken de Resgate: C\u00f3digo alfanum\u00e9rico fornecido pela Agisa ao Cliente para a efetiva\u00e7\u00e3o da utiliza\u00e7\u00e3o do B\u00f4nus.\r\nSaldo de B\u00f4nus: Montante total de B\u00f4nus acumulados e dispon\u00edveis para utiliza\u00e7\u00e3o pelo Cliente.\r\nValidade: Per\u00edodo de 12 (doze) meses a partir da data de gera\u00e7\u00e3o de cada B\u00f4nus, ap\u00f3s o qual o B\u00f4nus expira automaticamente.\r\n\r\n4. FUNCIONAMENTO DO PROGRAMA\r\n\r\n4.1. Princ\u00edpio Geral\r\n\r\nO Programa Giftback Agisa permite que o Cliente acumule um B\u00f4nus equivalente a 5% (cinco por cento) do valor bruto das loca\u00e7\u00f5es pagas em dia, para ser utilizado como cr\u00e9dito em um Novo Contrato.\r\n\r\n4.2. Gera\u00e7\u00e3o do B\u00f4nus\r\n\r\nO B\u00f4nus \u00e9 gerado apenas sobre Faturas Eleg\u00edveis, ou seja, faturas de loca\u00e7\u00e3o pagas em dia e cujo valor do cr\u00e9dito tenha sido devidamente confirmado na conta corrente das locadoras.\r\n\r\nO c\u00e1lculo do B\u00f4nus incide sobre o valor bruto da loca\u00e7\u00e3o, excluindo-se impostos, taxas, multas, juros e quaisquer outros encargos adicionais.\r\n\r\nO B\u00f4nus \u00e9 gerado exclusivamente por fatura j\u00e1 paga.\r\n\r\nN\u00e3o h\u00e1 valor m\u00ednimo de loca\u00e7\u00e3o para a gera\u00e7\u00e3o do B\u00f4nus.\r\n\r\n4.3. Disponibiliza\u00e7\u00e3o\r\n\r\nO B\u00f4nus gerado ser\u00e1 disponibilizado na \u00c1rea do Cliente ap\u00f3s a confirma\u00e7\u00e3o do pagamento da Fatura Eleg\u00edvel e a devida compensa\u00e7\u00e3o banc\u00e1ria do valor na conta da Agisa.\r\n\r\n5. PRODUTOS E SERVI\u00c7OS ELEG\u00cdVEIS\r\n\r\nA gera\u00e7\u00e3o de B\u00f4nus aplica-se exclusivamente a loca\u00e7\u00f5es de m\u00f3dulos e ar-condicionado realizadas com a Agisa Containers Ltda e Agisa Solu\u00e7\u00f5es Modulares. Outros produtos ou servi\u00e7os n\u00e3o geram B\u00f4nus.\r\n\r\n6. VALIDADE DO B\u00d4NUS\r\n\r\nCada B\u00f4nus gerado ter\u00e1 validade de 12 (doze) meses, contados a partir da data de sua gera\u00e7\u00e3o.\r\n\r\nAp\u00f3s o per\u00edodo de validade, o B\u00f4nus expirar\u00e1 automaticamente, sem possibilidade de reativa\u00e7\u00e3o ou compensa\u00e7\u00e3o.\r\n\r\nA expira\u00e7\u00e3o do B\u00f4nus n\u00e3o gera qualquer tipo de penalidade ou \u00f4nus para o Cliente ou para a Agisa.\r\n\r\n7. UTILIZA\u00c7\u00c3O DO B\u00d4NUS\r\n\r\n7.1. Aplica\u00e7\u00e3o\r\n\r\nO B\u00f4nus acumulado poder\u00e1 ser utilizado exclusivamente em Novos Contratos de loca\u00e7\u00e3o, n\u00e3o sendo aplic\u00e1vel a Contratos Vigentes.\r\n\r\n7.2. Percentual de Utiliza\u00e7\u00e3o\r\n\r\nO Cliente poder\u00e1 utilizar 100% (cem por cento) do seu Saldo de B\u00f4nus dispon\u00edvel para abater o valor da primeira parcela de um Novo Contrato.\r\n\r\n7.3. Procedimento de Resgate\r\n\r\nO resgate para utiliza\u00e7\u00e3o em Novo Contrato \u00e9 realizado diretamente pelo Cliente, mediante solicita\u00e7\u00e3o aos canais de atendimento da Agisa, que orientar\u00e1 sobre o processo.\r\n\r\n7.4. Token de Resgate\r\n\r\nA Agisa ir\u00e1 informar o n\u00famero do Token de Resgate ao Cliente para a efetiva\u00e7\u00e3o da utiliza\u00e7\u00e3o do B\u00f4nus no momento da formaliza\u00e7\u00e3o do Novo Contrato.\r\n\r\n7.5. Requisitos para Resgate\r\n\r\nPara efetuar o resgate do B\u00f4nus, o Cliente dever\u00e1 cumprir as seguintes obriga\u00e7\u00f5es na \u00c1rea do Cliente:\r\na) Preenchimento completo da pesquisa de satisfa\u00e7\u00e3o;\r\nb) Atualiza\u00e7\u00e3o e valida\u00e7\u00e3o dos dados cadastrais da empresa;\r\nc) Cumprimento de demais obriga\u00e7\u00f5es que surgirem ao longo do Programa.\r\n\r\n7.6. N\u00e3o Cumprimento dos Requisitos\r\n\r\nO n\u00e3o cumprimento dos requisitos acima impede a utiliza\u00e7\u00e3o do B\u00f4nus at\u00e9 que todas as obriga\u00e7\u00f5es sejam regularizadas.\r\n\r\n8. CONDI\u00c7\u00d5ES DE ELEGIBILIDADE\r\n\r\n8.1. Adimpl\u00eancia\r\n\r\nPara gerar e utilizar o B\u00f4nus, o Cliente dever\u00e1 estar adimplente com todas as suas obriga\u00e7\u00f5es financeiras e contratuais junto \u00e0 Agisa.\r\n\r\n8.2. Contrato Ativo\r\n\r\nO Cliente deve possuir um contrato ativo com a Agisa no momento da solicita\u00e7\u00e3o de resgate do B\u00f4nus.\r\n\r\n8.3. Regularidade Cadastral\r\n\r\nOs dados cadastrais do Cliente devem estar atualizados e validados junto \u00e0 Agisa.\r\n\r\n9. INTRANSFERIBILIDADE\r\n\r\nO B\u00f4nus \u00e9 pessoal e intransfer\u00edvel, n\u00e3o podendo ser cedido, vendido, trocado ou de qualquer forma transferido a terceiros, sejam eles pessoas f\u00edsicas ou jur\u00eddicas.\r\n\r\n10. CONSULTA DE SALDO\r\n\r\nO Cliente poder\u00e1 consultar seu Saldo de B\u00f4nus na \u00c1rea do Cliente, onde estar\u00e3o dispon\u00edveis informa\u00e7\u00f5es como:\r\n\r\nSaldo total acumulado;\r\nData de gera\u00e7\u00e3o de cada B\u00f4nus;\r\nValidade individual de cada B\u00f4nus;\r\nHist\u00f3rico de utiliza\u00e7\u00e3o.\r\n\r\n11. EXCLUS\u00d5ES\r\n\r\n11.1. Situa\u00e7\u00f5es que N\u00e3o Geram B\u00f4nus\r\n\r\nN\u00e3o geram B\u00f4nus as seguintes situa\u00e7\u00f5es:\r\n\r\nPagamentos de faturas em atraso;\r\nFaturas cujo valor ainda n\u00e3o foi creditado na conta corrente das locadoras;\r\nPagamentos realizados com descontos, abatimentos ou isen\u00e7\u00f5es n\u00e3o previstos contratualmente;\r\nValores referentes a d\u00edvidas renegociadas.\r\n\r\n11.2. Restri\u00e7\u00f5es de Utiliza\u00e7\u00e3o\r\n\r\nO B\u00f4nus n\u00e3o poder\u00e1 ser utilizado para:\r\n\r\nAbatimento em Contratos Vigentes;\r\nPagamento de servi\u00e7os, fretes, montagens, desmontagens ou outros custos operacionais;\r\nPagamento de multas, juros, encargos morat\u00f3rios ou penalidades;\r\nAjustes retroativos em contratos.\r\n\r\n12. CANCELAMENTO E DEVOLU\u00c7\u00c3O\r\n\r\nN\u00e3o h\u00e1 previs\u00e3o de cancelamento ou devolu\u00e7\u00e3o do B\u00f4nus em dinheiro. Caso o Cliente n\u00e3o celebre um Novo Contrato no prazo de 12 (doze) meses a partir da gera\u00e7\u00e3o do B\u00f4nus, este caducar\u00e1 automaticamente, conforme item 6 desta Pol\u00edtica.\r\n\r\n13. MODIFICA\u00c7\u00d5ES DO PROGRAMA\r\n\r\nA Agisa reserva-se o direito de, a qualquer tempo e a seu exclusivo crit\u00e9rio, modificar, suspender ou encerrar o Programa Giftback Agisa, mediante comunica\u00e7\u00e3o pr\u00e9via aos Clientes com anteced\u00eancia m\u00ednima de 30 (trinta) dias, ressalvadas as disposi\u00e7\u00f5es transit\u00f3rias do item 15.\r\n\r\n14. DISPOSI\u00c7\u00d5ES GERAIS\r\n\r\nO B\u00f4nus n\u00e3o possui valor monet\u00e1rio e n\u00e3o pode ser convertido em dinheiro, nem trocado por outros produtos ou servi\u00e7os que n\u00e3o sejam os expressamente previstos nesta Pol\u00edtica.\r\n\r\nA Agisa ter\u00e1 a decis\u00e3o final sobre quaisquer quest\u00f5es n\u00e3o previstas nesta Pol\u00edtica ou sobre disputas relacionadas ao Programa.\r\n\r\nA participa\u00e7\u00e3o no Programa Giftback Agisa n\u00e3o confere ao Cliente qualquer direito adquirido sobre o B\u00f4nus, sendo este um benef\u00edcio concedido por liberalidade da Agisa.\r\n\r\nO Programa Giftback Agisa \u00e9 uma campanha comercial e n\u00e3o se confunde com qualquer tipo de investimento ou aplica\u00e7\u00e3o financeira.\r\n\r\n15. DISPOSI\u00c7\u00d5ES TRANSIT\u00d3RIAS - FASE DE AJUSTES 2026\r\n\r\n15.1. O Programa de B\u00f4nus Giftback encontra-se em fase de ajustes durante o ano de 2026, podendo sofrer altera\u00e7\u00f5es de regras, condi\u00e7\u00f5es e procedimentos sem aviso pr\u00e9vio aos Clientes.\r\n\r\n15.2. As altera\u00e7\u00f5es realizadas durante a fase de ajustes n\u00e3o geram qualquer tipo de preju\u00edzo aos Clientes, uma vez que o Programa est\u00e1 sendo iniciado como uma pol\u00edtica de campanha aplicada sobre contratos j\u00e1 existentes.\r\n\r\n15.3. Os contratos vigentes n\u00e3o foram firmados com o conhecimento pr\u00e9vio deste Programa, sendo o B\u00f4nus Giftback um benef\u00edcio adicional concedido pela Agisa aos seus clientes.\r\n\r\n15.4. A Agisa reserva-se o direito de, durante o ano de 2026:\r\na) Modificar percentuais de bonifica\u00e7\u00e3o;\r\nb) Alterar prazos de validade;\r\nc) Incluir ou excluir produtos\/servi\u00e7os eleg\u00edveis;\r\nd) Ajustar requisitos para resgate;\r\ne) Implementar novas funcionalidades na \u00c1rea do Cliente;\r\nf) Suspender temporariamente o Programa para ajustes t\u00e9cnicos.\r\n\r\n15.5. Ap\u00f3s o t\u00e9rmino da fase de ajustes, eventuais altera\u00e7\u00f5es nas regras do Programa ser\u00e3o comunicadas aos Clientes com anteced\u00eancia m\u00ednima de 30 (trinta) dias.\r\n\r\n15.6. Os B\u00f4nus j\u00e1 gerados e dispon\u00edveis no Saldo de B\u00f4nus do Cliente ser\u00e3o respeitados conforme as regras vigentes no momento de sua gera\u00e7\u00e3o, salvo se as novas regras forem mais ben\u00e9ficas ao Cliente.\r\n\r\n16. ACEITE E VIG\u00caNCIA\r\n\r\nEsta Pol\u00edtica entra em vigor na data de sua publica\u00e7\u00e3o. A utiliza\u00e7\u00e3o do B\u00f4nus ou a continuidade da rela\u00e7\u00e3o contratual com a Agisa ap\u00f3s a publica\u00e7\u00e3o desta Pol\u00edtica implica na aceita\u00e7\u00e3o integral de todas as suas condi\u00e7\u00f5es pelo Cliente.\r\n\r\nDECLARA\u00c7\u00c3O DE CI\u00caNCIA E CONCORD\u00c2NCIA\r\n\r\nPelo presente instrumento, as partes declaram ter lido, compreendido e concordado com todos os termos e condi\u00e7\u00f5es da Pol\u00edtica de Utiliza\u00e7\u00e3o de B\u00f4nus - Programa Giftback Agisa.`;\r\n\r\n\/* ===============================\r\n   \u2705 STATE\r\n   =============================== *\/\r\nlet saldoDisponivel = 0;\r\nlet CNPJ_VINCULADO = \"\";\r\n\r\n\/* ===============================\r\n   \u2705 HELPERS\r\n   =============================== *\/\r\nfunction showToast(msg){\r\n  const t = document.getElementById(\"toast\");\r\n  t.textContent = msg;\r\n  t.classList.remove(\"hidden\");\r\n  setTimeout(()=>t.classList.add(\"hidden\"), 2800);\r\n}\r\nfunction onlyDigits(s){ return String(s||\"\").replace(\/\\D\/g,\"\"); }\r\nfunction fmtMoney(v){\r\n  const n = Number(v||0);\r\n  return \"R$ \" + n.toFixed(2).replace(\".\", \",\");\r\n}\r\nfunction fmtDate(v){\r\n  const d = toDateAny(v);\r\n  if(!d) return \"-\";\r\n  return d.toLocaleDateString(\"pt-BR\") + \" \" + d.toLocaleTimeString(\"pt-BR\", {hour:\"2-digit\", minute:\"2-digit\"});\r\n}\r\nfunction setAuthMsg(msg, type){\r\n  const box = document.getElementById(\"authMsg\");\r\n  if(!msg){\r\n    box.classList.add(\"hidden\");\r\n    box.textContent = \"\";\r\n    return;\r\n  }\r\n  box.classList.remove(\"hidden\");\r\n  if(type === \"ok\"){\r\n    box.className = \"mt-4 text-sm p-3 rounded-lg border border-green-400\/30 bg-green-500\/10 text-green-200\";\r\n  }else{\r\n    box.classNamedName = \"mt-4 text-sm p-3 rounded-lg border border-red-400\/30 bg-red-500\/10 text-red-200\";\r\n  }\r\n  box.textContent = msg;\r\n}\r\nfunction toDateAny(v){\r\n  if(!v) return null;\r\n  if(typeof v?.toDate === \"function\") return v.toDate();\r\n  const d = new Date(v);\r\n  return isNaN(d.getTime()) ? null : d;\r\n}\r\nfunction reciboEstaVencido(recibo){\r\n  const r = recibo || {};\r\n  const v = toDateAny(r.validadeSaldoEm);\r\n  if(v) return v.getTime() < Date.now();\r\n  const d = toDateAny(r.data);\r\n  if(d){\r\n    const exp = new Date(d.getTime() + SALDO_VALIDADE_DIAS_FALLBACK*24*60*60*1000);\r\n    return exp.getTime() < Date.now();\r\n  }\r\n  return false;\r\n}\r\nfunction tokenEstaExpirado(tokenData){\r\n  const t = tokenData || {};\r\n  const exp = toDateAny(t.expiraEm);\r\n  if(exp) return exp.getTime() < Date.now();\r\n  const criado = toDateAny(t.criadoEm);\r\n  if(criado){\r\n    const exp2 = new Date(criado.getTime() + TOKEN_VALIDADE_DIAS_FALLBACK*24*60*60*1000);\r\n    return exp2.getTime() < Date.now();\r\n  }\r\n  return false;\r\n}\r\nfunction getCnpjAtual(){\r\n  const vinc = onlyDigits(CNPJ_VINCULADO || \"\");\r\n  if(vinc) return vinc;\r\n  const digitado = onlyDigits(document.getElementById(\"cCnpj\").value || \"\");\r\n  return digitado;\r\n}\r\n\r\n\/* ===============================\r\n   \u2705 POL\u00cdTICA (UI + FIRESTORE)\r\n   =============================== *\/\r\nfunction abrirModalPolitica(){\r\n  const m = document.getElementById(\"modalPolitica\");\r\n  m.classList.remove(\"hidden\");\r\n  m.classList.add(\"flex\");\r\n}\r\nfunction fecharModalPolitica(){\r\n  const m = document.getElementById(\"modalPolitica\");\r\n  m.classList.add(\"hidden\");\r\n  m.classList.remove(\"flex\");\r\n}\r\nfunction setPoliticaErro(msg){\r\n  const box = document.getElementById(\"politicaErro\");\r\n  if(!msg){\r\n    box.classList.add(\"hidden\");\r\n    box.textContent = \"\";\r\n    return;\r\n  }\r\n  box.textContent = msg;\r\n  box.classList.remove(\"hidden\");\r\n}\r\nfunction fmtCpfDigits(cpf){ return onlyDigits(cpf).slice(0, 11); }\r\nfunction isCpfValidoBasico(cpfDigits){\r\n  if(!cpfDigits || cpfDigits.length !== 11) return false;\r\n  if(\/^(\\d)\\1{10}$\/.test(cpfDigits)) return false;\r\n  return true;\r\n}\r\nfunction carregarTextoPoliticaNoModal(){\r\n  const el = document.getElementById(\"politicaTexto\");\r\n  if(!el) return;\r\n  el.textContent = POLITICA_TEXTO;\r\n}\r\nasync function verificarPoliticaAceitaParaCnpj(cnpj){\r\n  const cnpj14 = onlyDigits(cnpj || \"\");\r\n  if(!cnpj14 || cnpj14.length !== 14) return false;\r\n  const doc = await db.collection(POLITICA_COLLECTION).doc(cnpj14).get();\r\n  if(!doc.exists) return false;\r\n  const data = doc.data() || {};\r\n  return !!data.aceite;\r\n}\r\nasync function exigirAceitePoliticaSeNecessario(){\r\n  if(!auth.currentUser) return;\r\n  const cnpj = getCnpjAtual();\r\n  if(!cnpj || cnpj.length !== 14) return;\r\n\r\n  const aceito = await verificarPoliticaAceitaParaCnpj(cnpj);\r\n  if(aceito){\r\n    fecharModalPolitica();\r\n    return;\r\n  }\r\n\r\n  carregarTextoPoliticaNoModal();\r\n  document.getElementById(\"politicaCnpjLabel\").textContent = cnpj;\r\n  document.getElementById(\"politicaVersaoLabel\").textContent = POLITICA_VERSAO;\r\n  document.getElementById(\"chkAceitePolitica\").checked = false;\r\n  document.getElementById(\"respNome\").value = \"\";\r\n  document.getElementById(\"respCpf\").value = \"\";\r\n  setPoliticaErro(\"\");\r\n  abrirModalPolitica();\r\n}\r\nasync function salvarAceitePolitica(){\r\n  if(!auth.currentUser){ setPoliticaErro(\"Fa\u00e7a login novamente.\"); return; }\r\n\r\n  const cnpj = getCnpjAtual();\r\n  if(!cnpj || cnpj.length !== 14){\r\n    setPoliticaErro(\"CNPJ inv\u00e1lido. Vincule ou informe um CNPJ v\u00e1lido antes do aceite.\");\r\n    return;\r\n  }\r\n\r\n  const nome = (document.getElementById(\"respNome\").value || \"\").trim();\r\n  const cpfDigits = fmtCpfDigits(document.getElementById(\"respCpf\").value || \"\");\r\n  const aceito = document.getElementById(\"chkAceitePolitica\").checked;\r\n\r\n  if(!nome || nome.length < 3){ setPoliticaErro(\"Informe o nome do respons\u00e1vel.\"); return; }\r\n  if(!isCpfValidoBasico(cpfDigits)){ setPoliticaErro(\"CPF inv\u00e1lido. Digite um CPF com 11 n\u00fameros.\"); return; }\r\n  if(!aceito){ setPoliticaErro(\"Voc\u00ea precisa marcar o aceite para continuar.\"); return; }\r\n\r\n  const cnpj14 = onlyDigits(cnpj);\r\n  const btn = document.getElementById(\"btnAceitarPolitica\");\r\n  btn.disabled = true;\r\n  btn.textContent = \"SALVANDO...\";\r\n\r\n  try{\r\n    const ref = db.collection(POLITICA_COLLECTION).doc(cnpj14);\r\n\r\n    const existing = await ref.get();\r\n    if(existing.exists){\r\n      fecharModalPolitica();\r\n      showToast(\"Pol\u00edtica j\u00e1 aceita \u2705\");\r\n      return;\r\n    }\r\n\r\n    await ref.set({\r\n      cnpj: cnpj14,\r\n      uid: auth.currentUser.uid,\r\n      email: auth.currentUser.email || \"\",\r\n      nomeResponsavel: nome,\r\n      cpfResponsavel: cpfDigits,\r\n      aceite: true,\r\n      versao: POLITICA_VERSAO,\r\n      origem: \"area_cliente\",\r\n      dataHora: firebase.firestore.FieldValue.serverTimestamp()\r\n    }, { merge:false });\r\n\r\n    fecharModalPolitica();\r\n    showToast(\"Aceite registrado \u2705\");\r\n  }catch(e){\r\n    console.error(e);\r\n    setPoliticaErro(\"Erro ao salvar o aceite. Verifique as Rules do Firestore.\");\r\n  }finally{\r\n    btn.disabled = false;\r\n    btn.textContent = \"ACEITAR E CONTINUAR\";\r\n  }\r\n}\r\n\r\n\/* ===============================\r\n   \u2705 UI TOGGLE (Login\/Cadastro)\r\n   =============================== *\/\r\nconst loginCard = document.getElementById(\"loginCard\");\r\nconst cadastroCard = document.getElementById(\"cadastroCard\");\r\nconst btnAbrirCadastro = document.getElementById(\"btnAbrirCadastro\");\r\nconst btnVoltarLogin = document.getElementById(\"btnVoltarLogin\");\r\n\r\nfunction mostrarCadastro(){\r\n  loginCard.classList.add(\"hidden\");\r\n  cadastroCard.classList.remove(\"hidden\");\r\n  setAuthMsg(\"\", \"ok\");\r\n}\r\nfunction mostrarLogin(){\r\n  cadastroCard.classList.add(\"hidden\");\r\n  loginCard.classList.remove(\"hidden\");\r\n  setAuthMsg(\"\", \"ok\");\r\n}\r\nbtnAbrirCadastro.addEventListener(\"click\", (e)=>{ e.preventDefault(); mostrarCadastro(); });\r\nbtnVoltarLogin.addEventListener(\"click\", (e)=>{ e.preventDefault(); mostrarLogin(); });\r\nmostrarLogin();\r\n\r\n\/* ===============================\r\n   \u2705 AUTH ELEMENTS\r\n   =============================== *\/\r\nconst authView     = document.getElementById(\"authView\");\r\nconst conteudoView = document.getElementById(\"conteudoView\");\r\nconst authStatus   = document.getElementById(\"authStatus\");\r\nconst btnLogout    = document.getElementById(\"btnLogout\");\r\n\r\nconst loginEmail = document.getElementById(\"loginEmail\");\r\nconst loginSenha = document.getElementById(\"loginSenha\");\r\nconst btnLogin   = document.getElementById(\"btnLogin\");\r\nconst btnResetSenha = document.getElementById(\"btnResetSenha\");\r\n\r\nconst cadCnpj   = document.getElementById(\"cadCnpj\");\r\nconst cadEmail  = document.getElementById(\"cadEmail\");\r\nconst cadSenha1 = document.getElementById(\"cadSenha1\");\r\nconst cadSenha2 = document.getElementById(\"cadSenha2\");\r\nconst btnCadastrar = document.getElementById(\"btnCadastrar\");\r\n\r\nconst cCnpj = document.getElementById(\"cCnpj\");\r\nconst cnpjHint = document.getElementById(\"cnpjHint\");\r\nconst blocoVincularCnpj = document.getElementById(\"blocoVincularCnpj\");\r\nconst btnVincularCnpj = document.getElementById(\"btnVincularCnpj\");\r\n\r\n\/* ===============================\r\n   \u2705 AUTH ACTIONS\r\n   =============================== *\/\r\nbtnLogout.addEventListener(\"click\", async ()=>{\r\n  await auth.signOut();\r\n  location.reload();\r\n});\r\n\r\nbtnLogin.addEventListener(\"click\", async ()=>{\r\n  setAuthMsg(\"\", \"ok\");\r\n  const email = (loginEmail.value||\"\").trim();\r\n  const senha = (loginSenha.value||\"\").trim();\r\n\r\n  if(!email || !senha){\r\n    setAuthMsg(\"Preencha e-mail e senha para entrar.\", \"err\");\r\n    return;\r\n  }\r\n\r\n  btnLogin.disabled = true;\r\n  btnLogin.textContent = \"ENTRANDO...\";\r\n\r\n  try{\r\n    await auth.signInWithEmailAndPassword(email, senha);\r\n  }catch(e){\r\n    console.error(e);\r\n    setAuthMsg(\"Erro ao entrar. Verifique e-mail\/senha.\", \"err\");\r\n  }finally{\r\n    btnLogin.disabled = false;\r\n    btnLogin.textContent = \"ENTRAR\";\r\n  }\r\n});\r\n\r\nbtnResetSenha.addEventListener(\"click\", async ()=>{\r\n  const email = (loginEmail.value||\"\").trim();\r\n  if(!email){\r\n    setAuthMsg(\"Digite seu e-mail no campo de login para recuperar a senha.\", \"err\");\r\n    return;\r\n  }\r\n  try{\r\n    await auth.sendPasswordResetEmail(email);\r\n    setAuthMsg(\"Enviei um e-mail de recupera\u00e7\u00e3o. Verifique sua caixa de entrada.\", \"ok\");\r\n  }catch(e){\r\n    console.error(e);\r\n    setAuthMsg(\"N\u00e3o consegui enviar a recupera\u00e7\u00e3o. Verifique o e-mail.\", \"err\");\r\n  }\r\n});\r\n\r\nbtnCadastrar.addEventListener(\"click\", async ()=>{\r\n  setAuthMsg(\"\", \"ok\");\r\n\r\n  const cnpj = onlyDigits(cadCnpj.value||\"\");\r\n  const email = (cadEmail.value||\"\").trim();\r\n  const s1 = (cadSenha1.value||\"\").trim();\r\n  const s2 = (cadSenha2.value||\"\").trim();\r\n\r\n  if(!cnpj){ setAuthMsg(\"Informe o CNPJ para vincular o acesso.\", \"err\"); return; }\r\n  if(cnpj.length !== 14){ setAuthMsg(\"CNPJ inv\u00e1lido. Digite 14 n\u00fameros.\", \"err\"); return; }\r\n  if(!email || !s1 || !s2){ setAuthMsg(\"Preencha e-mail e senha (duas vezes).\", \"err\"); return; }\r\n  if(s1.length < 6){ setAuthMsg(\"A senha precisa ter no m\u00ednimo 6 caracteres.\", \"err\"); return; }\r\n  if(s1 !== s2){ setAuthMsg(\"As senhas n\u00e3o conferem.\", \"err\"); return; }\r\n\r\n  btnCadastrar.disabled = true;\r\n  btnCadastrar.textContent = \"CADASTRANDO...\";\r\n\r\n  try{\r\n    const cred = await auth.createUserWithEmailAndPassword(email, s1);\r\n    const uid = cred.user.uid;\r\n\r\n    await db.collection(CADASTRO_CLIENTE_COLLECTION).doc(uid).set({\r\n      uid,\r\n      email,\r\n      cnpj,\r\n      ativo: true,\r\n      criadoEm: firebase.firestore.FieldValue.serverTimestamp()\r\n    }, { merge:true });\r\n\r\n    setAuthMsg(\"Cadastro criado e autenticado com sucesso!\", \"ok\");\r\n    showToast(\"Conta criada \u2705\");\r\n\r\n    CNPJ_VINCULADO = cnpj;\r\n    cCnpj.value = cnpj;\r\n    cCnpj.disabled = true;\r\n    blocoVincularCnpj.classList.add(\"hidden\");\r\n    cnpjHint.textContent = \"Campo bloqueado: CNPJ vinculado ao seu login.\";\r\n\r\n    await exigirAceitePoliticaSeNecessario();\r\n\r\n  }catch(e){\r\n    console.error(e);\r\n    if(String(e?.code||\"\") === \"auth\/email-already-in-use\"){\r\n      setAuthMsg(\"Este e-mail j\u00e1 est\u00e1 em uso. Fa\u00e7a login.\", \"err\");\r\n      mostrarLogin();\r\n      loginEmail.value = email;\r\n    }else if(String(e?.code||\"\") === \"auth\/operation-not-allowed\"){\r\n      setAuthMsg(\"No Firebase: habilite Email\/Senha em Authentication \u2192 Sign-in method.\", \"err\");\r\n    }else{\r\n      setAuthMsg(\"Erro ao cadastrar. Tente novamente.\", \"err\");\r\n    }\r\n  }finally{\r\n    btnCadastrar.disabled = false;\r\n    btnCadastrar.textContent = \"CADASTRAR\";\r\n  }\r\n});\r\n\r\nasync function carregarCnpjDoUsuario(uid){\r\n  const ref = db.collection(CADASTRO_CLIENTE_COLLECTION).doc(uid);\r\n  const doc = await ref.get();\r\n  if(!doc.exists) return \"\";\r\n  const data = doc.data() || {};\r\n  return onlyDigits(data.cnpj || \"\");\r\n}\r\n\r\nasync function vincularCnpjAoLogin(){\r\n  if(!auth.currentUser){ alert(\"Fa\u00e7a login.\"); return; }\r\n\r\n  const cnpj = onlyDigits(cCnpj.value || \"\");\r\n  if(!cnpj || cnpj.length !== 14){\r\n    alert(\"Digite um CNPJ v\u00e1lido (14 n\u00fameros).\");\r\n    return;\r\n  }\r\n\r\n  btnVincularCnpj.disabled = true;\r\n  btnVincularCnpj.textContent = \"VINCULANDO...\";\r\n\r\n  try{\r\n    await db.collection(CADASTRO_CLIENTE_COLLECTION).doc(auth.currentUser.uid).set({\r\n      uid: auth.currentUser.uid,\r\n      email: auth.currentUser.email || \"\",\r\n      cnpj: cnpj,\r\n      ativo: true,\r\n      atualizadoEm: firebase.firestore.FieldValue.serverTimestamp()\r\n    }, { merge:true });\r\n\r\n    CNPJ_VINCULADO = cnpj;\r\n    cCnpj.value = CNPJ_VINCULADO;\r\n    cCnpj.disabled = true;\r\n    blocoVincularCnpj.classList.add(\"hidden\");\r\n    cnpjHint.textContent = \"Campo bloqueado: CNPJ vinculado ao seu login.\";\r\n\r\n    showToast(\"CNPJ vinculado \u2705\");\r\n  }catch(e){\r\n    console.error(e);\r\n    alert(\"Erro ao vincular CNPJ. Verifique as Rules do Firestore.\");\r\n  }finally{\r\n    btnVincularCnpj.disabled = false;\r\n    btnVincularCnpj.textContent = \"VINCULAR CNPJ AO MEU LOGIN\";\r\n  }\r\n}\r\n\r\nbtnVincularCnpj.addEventListener(\"click\", (e)=>{\r\n  e.preventDefault();\r\n  vincularCnpjAoLogin();\r\n});\r\n\r\n\/* ===============================\r\n   \u2705 AUTH STATE\r\n   =============================== *\/\r\nauth.onAuthStateChanged(async (user)=>{\r\n  setAuthMsg(\"\", \"ok\");\r\n\r\n  CNPJ_VINCULADO = \"\";\r\n  cCnpj.value = \"\";\r\n  cCnpj.disabled = true;\r\n  blocoVincularCnpj.classList.add(\"hidden\");\r\n  cnpjHint.textContent = \"Carregando seu CNPJ...\";\r\n  document.getElementById(\"painelCliente\").classList.add(\"hidden\");\r\n\r\n  if(!user){\r\n    authStatus.textContent = \"N\u00e3o logado\";\r\n    btnLogout.classList.add(\"hidden\");\r\n    authView.classList.remove(\"hidden\");\r\n    conteudoView.classList.add(\"hidden\");\r\n    mostrarLogin();\r\n    fecharModalPolitica();\r\n    return;\r\n  }\r\n\r\n  authStatus.textContent = `Logado: ${user.email || user.uid}`;\r\n  btnLogout.classList.remove(\"hidden\");\r\n  authView.classList.add(\"hidden\");\r\n  conteudoView.classList.remove(\"hidden\");\r\n\r\n  try{\r\n    const cnpjDoBanco = await carregarCnpjDoUsuario(user.uid);\r\n    CNPJ_VINCULADO = onlyDigits(cnpjDoBanco || \"\");\r\n\r\n    if(CNPJ_VINCULADO){\r\n      cCnpj.value = CNPJ_VINCULADO;\r\n      cCnpj.disabled = true;\r\n      blocoVincularCnpj.classList.add(\"hidden\");\r\n      cnpjHint.textContent = \"Campo bloqueado: CNPJ vinculado ao seu login.\";\r\n    }else{\r\n      cCnpj.value = \"\";\r\n      cCnpj.disabled = false;\r\n      blocoVincularCnpj.classList.remove(\"hidden\");\r\n      cnpjHint.textContent = \"Digite seu CNPJ e clique em VINCULAR (ou apenas consulte).\";\r\n    }\r\n\r\n  }catch(e){\r\n    console.error(e);\r\n    cCnpj.disabled = false;\r\n    blocoVincularCnpj.classList.remove(\"hidden\");\r\n    cnpjHint.textContent = \"Erro ao buscar CNPJ. Digite e vincule.\";\r\n  }\r\n});\r\n\r\n\/* ===============================\r\n   \u2705 HIST\u00d3RICO DE RECEBIMENTOS\r\n   =============================== *\/\r\nasync function carregarHistoricoRecebimentos(){\r\n  if(!auth.currentUser){ return; }\r\n\r\n  const cnpj = getCnpjAtual();\r\n  if(!cnpj || cnpj.length !== 14){\r\n    document.getElementById(\"listaRecebimentos\").innerHTML = \"\";\r\n    document.getElementById(\"recebCount\").textContent = \"0 entradas\";\r\n    return;\r\n  }\r\n\r\n  const tbody = document.getElementById(\"listaRecebimentos\");\r\n  tbody.innerHTML = `\r\n    <tr class=\"border-b border-gray-800\/60\">\r\n      <td class=\"py-3 text-gray-400\" colspan=\"8\">Carregando recebimentos...<\/td>\r\n    <\/tr>\r\n  `;\r\n\r\n  try{\r\n    const snap = await db.collection(\"cashback_contracts\")\r\n      .where(\"CNPJ\", \"==\", cnpj)\r\n      .get();\r\n\r\n    if(snap.empty){\r\n      tbody.innerHTML = `\r\n        <tr class=\"border-b border-gray-800\/60\">\r\n          <td class=\"py-3 text-gray-400\" colspan=\"8\">Nenhum contrato encontrado.<\/td>\r\n        <\/tr>\r\n      `;\r\n      document.getElementById(\"recebCount\").textContent = \"0 entradas\";\r\n      return;\r\n    }\r\n\r\n    const entradas = [];\r\n\r\n    snap.forEach(doc=>{\r\n      const c = doc.data() || {};\r\n\r\n      const nomeCliente =\r\n        c.nomeCliente ||\r\n        c[\"Nome do cliente\"] ||\r\n        c.cliente ||\r\n        c.nome ||\r\n        \"-\";\r\n\r\n      const contratoNumero =\r\n        c[\"N\u00famero do contrato\"] ||\r\n        c.numeroContrato ||\r\n        c.contrato ||\r\n        \"-\";\r\n\r\n      const valorContrato =\r\n        Number(c.valorContrato || c[\"Valor do contrato\"] || c.valor || 0);\r\n\r\n      const pct =\r\n        Number(c.cashbackPercentual || c.percentualCashback || c.percentual || CASHBACK_PERCENT_PADRAO);\r\n\r\n      const pagamentos = c.pagamentos || {};\r\n\r\n      Object.keys(pagamentos).forEach(chave=>{\r\n        const p = pagamentos[chave] || {};\r\n        if(p.status !== \"PAGO\") return;\r\n\r\n        const recibo = p.recibo || {};\r\n        const dataEntrada = recibo.data || p.dataPagamento || p.pagoEm || null;\r\n\r\n        const cashbackRecebido =\r\n          Number(recibo.cashback ?? recibo.valorCashback ?? p.cashback ?? c.cashbackMensal ?? 0);\r\n\r\n        const reciboLink =\r\n          recibo.url ||\r\n          recibo.link ||\r\n          recibo.pdfUrl ||\r\n          \"\";\r\n\r\n        const reciboNumero =\r\n          recibo.numero ||\r\n          recibo.id ||\r\n          recibo.codigo ||\r\n          \"\";\r\n\r\n        entradas.push({\r\n          nomeCliente,\r\n          cnpj,\r\n          contratoNumero,\r\n          dataEntrada,\r\n          valorContrato,\r\n          pct,\r\n          cashbackRecebido,\r\n          reciboLink,\r\n          reciboNumero\r\n        });\r\n      });\r\n    });\r\n\r\n    entradas.sort((a,b)=>{\r\n      const da = toDateAny(a.dataEntrada)?.getTime() || 0;\r\n      const dbb = toDateAny(b.dataEntrada)?.getTime() || 0;\r\n      return dbb - da;\r\n    });\r\n\r\n    document.getElementById(\"recebCount\").textContent = `${entradas.length} entradas`;\r\n\r\n    if(!entradas.length){\r\n      tbody.innerHTML = `\r\n        <tr class=\"border-b border-gray-800\/60\">\r\n          <td class=\"py-3 text-gray-400\" colspan=\"8\">Nenhuma entrada PAGA encontrada.<\/td>\r\n        <\/tr>\r\n      `;\r\n      return;\r\n    }\r\n\r\n    tbody.innerHTML = entradas.map(e=>{\r\n      const reciboHtml = e.reciboLink\r\n        ? `<a class=\"text-yellow-300 underline\" href=\"${e.reciboLink}\" target=\"_blank\" rel=\"noopener\">Abrir<\/a>`\r\n        : (e.reciboNumero ? `<span class=\"text-gray-200\">${e.reciboNumero}<\/span>` : `<span class=\"text-gray-500\">-<\/span>`);\r\n\r\n      return `\r\n        <tr class=\"border-b border-gray-800\/60\">\r\n          <td class=\"py-2\">${e.nomeCliente}<\/td>\r\n          <td class=\"py-2\">${e.cnpj}<\/td>\r\n          <td class=\"py-2\">${e.contratoNumero}<\/td>\r\n          <td class=\"py-2\">${fmtDate(e.dataEntrada)}<\/td>\r\n          <td class=\"py-2\">${fmtMoney(e.valorContrato)}<\/td>\r\n          <td class=\"py-2\">${Number(e.pct || CASHBACK_PERCENT_PADRAO)}%<\/td>\r\n          <td class=\"py-2 text-green-400 font-extrabold\">${fmtMoney(e.cashbackRecebido)}<\/td>\r\n          <td class=\"py-2\">${reciboHtml}<\/td>\r\n        <\/tr>\r\n      `;\r\n    }).join(\"\");\r\n\r\n  }catch(err){\r\n    console.error(err);\r\n    tbody.innerHTML = `\r\n      <tr class=\"border-b border-gray-800\/60\">\r\n        <td class=\"py-3 text-red-400\" colspan=\"8\">Erro ao carregar recebimentos. Verifique Rules e console.<\/td>\r\n      <\/tr>\r\n    `;\r\n    document.getElementById(\"recebCount\").textContent = \"0 entradas\";\r\n  }\r\n}\r\n\r\n\/* ===============================\r\n   \u2705 CONSULTA (SALDOS + HIST\u00d3RICOS)\r\n   =============================== *\/\r\nasync function consultarCarteira(){\r\n  if(!auth.currentUser){ alert(\"Fa\u00e7a login.\"); return; }\r\n\r\n  const cnpj = getCnpjAtual();\r\n  if(!cnpj || cnpj.length !== 14){\r\n    alert(\"Informe um CNPJ v\u00e1lido (14 n\u00fameros).\");\r\n    return;\r\n  }\r\n\r\n  if(!(await verificarPoliticaAceitaParaCnpj(cnpj))){\r\n    await exigirAceitePoliticaSeNecessario();\r\n    return;\r\n  }\r\n\r\n  let saldo = 0;\r\n  let bloqueado = 0;\r\n\r\n  db.collection(\"cashback_contracts\")\r\n    .where(\"CNPJ\",\"==\",cnpj)\r\n    .get()\r\n    .then(s=>{\r\n      if(s.empty){ alert(\"Nenhum contrato encontrado\"); return; }\r\n\r\n      s.forEach(d=>{\r\n        const x = d.data();\r\n        const p = x.pagamentos || {};\r\n        const m = Number(x.contratoMeses || 0);\r\n        const v = Number(x.cashbackMensal || 0);\r\n\r\n        let pagas = 0;\r\n\r\n        Object.values(p).forEach(pp=>{\r\n          if(pp && pp.status===\"PAGO\"){\r\n            const rec = pp.recibo || {};\r\n            const recCash = Number(rec.cashback ?? x.cashbackMensal ?? 0);\r\n            if(!reciboEstaVencido(rec)) saldo += recCash;\r\n            pagas++;\r\n          }\r\n        });\r\n\r\n        bloqueado += (m - pagas) * v;\r\n      });\r\n\r\n      db.collection(\"uso_saldo\").where(\"cnpj\",\"==\",cnpj).get().then(u=>{\r\n        let usado = 0;\r\n        const listaUso = document.getElementById(\"listaUso\");\r\n        listaUso.innerHTML = \"\";\r\n\r\n        u.forEach(d=>{\r\n          const x=d.data();\r\n          usado += Number(x.valor || 0);\r\n          listaUso.innerHTML += `\r\n          <tr class=\"border-b border-gray-800\/60\">\r\n            <td class=\"py-2\">${fmtMoney(Number(x.valor||0))}<\/td>\r\n            <td class=\"py-2\">${x.novoContrato || \"-\"}<\/td>\r\n            <td class=\"py-2\">${x.data?.toDate ? x.data.toDate().toLocaleString(\"pt-BR\") : \"-\"}<\/td>\r\n          <\/tr>`;\r\n        });\r\n\r\n        saldo -= usado;\r\n        if(saldo<0) saldo=0;\r\n        saldoDisponivel = saldo;\r\n\r\n        document.getElementById(\"kSaldo\").innerText = fmtMoney(saldo);\r\n        document.getElementById(\"kBloquear\").innerText = fmtMoney(bloqueado);\r\n        document.getElementById(\"painelCliente\").classList.remove(\"hidden\");\r\n\r\n        carregarHistoricoRecebimentos();\r\n      });\r\n    })\r\n    .catch(err=>{\r\n      console.error(err);\r\n      alert(\"Erro na consulta. Verifique Firestore Rules e console.\");\r\n    });\r\n}\r\n\r\n\/* ===============================\r\n   \u2705 CONTRATOS\r\n   =============================== *\/\r\nfunction toggleContratos(){\r\n  const bloco=document.getElementById(\"blocoContratosInfo\");\r\n  const seta=document.getElementById(\"iconeSeta\");\r\n\r\n  if(bloco.classList.contains(\"hidden\")){\r\n    bloco.classList.remove(\"hidden\");\r\n    seta.innerText=\"\u25b2\";\r\n    carregarContratosInfo();\r\n  }else{\r\n    bloco.classList.add(\"hidden\");\r\n    seta.innerText=\"\u25bc\";\r\n  }\r\n}\r\n\r\nfunction carregarContratosInfo(){\r\n  if(!auth.currentUser){ alert(\"Fa\u00e7a login.\"); return; }\r\n\r\n  const cnpj = getCnpjAtual();\r\n  if(!cnpj || cnpj.length !== 14){ alert(\"Informe um CNPJ v\u00e1lido.\"); return; }\r\n\r\n  const listaContratosInfo = document.getElementById(\"listaContratosInfo\");\r\n  listaContratosInfo.innerHTML=\"\";\r\n\r\n  db.collection(\"cashback_contracts\")\r\n    .where(\"CNPJ\",\"==\",cnpj)\r\n    .get()\r\n    .then(s=>{\r\n      if(s.empty){\r\n        listaContratosInfo.innerHTML=\"<li class='text-gray-400'>Nenhum contrato encontrado.<\/li>\";\r\n        return;\r\n      }\r\n      s.forEach(d=>{\r\n        const contrato=d.data()[\"N\u00famero do contrato\"]||\"-\";\r\n        listaContratosInfo.innerHTML+=`\r\n        <li class=\"border-b border-gray-800\/60 py-2\">\r\n          Contrato n\u00ba <b>${contrato}<\/b>\r\n        <\/li>`;\r\n      });\r\n    })\r\n    .catch(err=>{\r\n      console.error(err);\r\n      alert(\"Erro ao carregar contratos. Verifique Rules.\");\r\n    });\r\n}\r\n\r\n\/* ===============================\r\n   \u2705 PESQUISA + USO SALDO\r\n   =============================== *\/\r\nasync function abrirPesquisaAntesDeUsarSaldo(){\r\n  if(!auth.currentUser){ alert(\"Fa\u00e7a login.\"); return; }\r\n\r\n  const cnpj = getCnpjAtual();\r\n  if(!cnpj || cnpj.length !== 14){ alert(\"Informe um CNPJ v\u00e1lido.\"); return; }\r\n\r\n  if(!(await verificarPoliticaAceitaParaCnpj(cnpj))){\r\n    await exigirAceitePoliticaSeNecessario();\r\n    return;\r\n  }\r\n\r\n  const valor=Number(document.getElementById(\"uValor\").value);\r\n  const token=document.getElementById(\"uToken\").value.trim();\r\n  const novoContrato=document.getElementById(\"uNovoContrato\").value.trim();\r\n\r\n  if(!valor||valor<=0){alert(\"Informe um valor v\u00e1lido\");return;}\r\n  if(valor>saldoDisponivel){alert(\"Saldo insuficiente\");return;}\r\n  if(!token){alert(\"Informe o token\");return;}\r\n  if(!novoContrato){alert(\"Informe o novo contrato\");return;}\r\n\r\n  const err = document.getElementById(\"pesqErro\");\r\n  err.classList.add(\"hidden\");\r\n  err.textContent = \"\";\r\n\r\n  const modal = document.getElementById(\"modalPesquisa\");\r\n  modal.classList.remove(\"hidden\");\r\n  modal.classList.add(\"flex\");\r\n}\r\n\r\nfunction fecharPesquisa(){\r\n  const modal = document.getElementById(\"modalPesquisa\");\r\n  modal.classList.add(\"hidden\");\r\n  modal.classList.remove(\"flex\");\r\n}\r\n\r\nfunction getRadioValue(name){\r\n  const el = document.querySelector(`input[name=\"${name}\"]:checked`);\r\n  return el ? el.value : \"\";\r\n}\r\n\r\nfunction validarPesquisaObrigatoria(){\r\n  const q1 = getRadioValue(\"q1\");\r\n  const q2 = getRadioValue(\"q2\");\r\n  const q3 = getRadioValue(\"q3\");\r\n  const q4 = getRadioValue(\"q4\");\r\n\r\n  const faltando = [];\r\n  if(!q1) faltando.push(\"Pergunta 1\");\r\n  if(!q2) faltando.push(\"Pergunta 2\");\r\n  if(!q3) faltando.push(\"Pergunta 3\");\r\n  if(!q4) faltando.push(\"Pergunta 4\");\r\n\r\n  const box = document.getElementById(\"pesqErro\");\r\n  if(faltando.length){\r\n    box.textContent = \"Responda obrigatoriamente: \" + faltando.join(\", \") + \".\";\r\n    box.classList.remove(\"hidden\");\r\n    return null;\r\n  }\r\n  box.classList.add(\"hidden\");\r\n  return { q1, q2, q3, q4 };\r\n}\r\n\r\nasync function validarTokenAtivoParaCnpj(token, cnpj){\r\n  const snap = await db.collection(\"wallet_tokens\")\r\n    .where(\"token\",\"==\",token)\r\n    .where(\"status\",\"==\",\"ATIVO\")\r\n    .limit(1)\r\n    .get();\r\n\r\n  if(snap.empty) return { ok:false, msg:\"Token inv\u00e1lido ou expirado.\" };\r\n\r\n  const tokenDoc = snap.docs[0];\r\n  const data = tokenDoc.data() || {};\r\n\r\n  const cnpjToken = onlyDigits(data.cnpj || \"\");\r\n  if(cnpjToken && cnpjToken !== cnpj){\r\n    return { ok:false, msg:\"Token n\u00e3o pertence a este CNPJ.\" };\r\n  }\r\n\r\n  if(tokenEstaExpirado(data)){\r\n    return { ok:false, msg:\"Token expirado. Solicite um novo token para a AGISA.\" };\r\n  }\r\n\r\n  return { ok:true, tokenDoc, data };\r\n}\r\n\r\nasync function enviarPesquisaEUsarSaldo(){\r\n  if(!auth.currentUser){ alert(\"Fa\u00e7a login.\"); return; }\r\n\r\n  const cnpj = getCnpjAtual();\r\n  if(!cnpj || cnpj.length !== 14){ alert(\"Informe um CNPJ v\u00e1lido.\"); return; }\r\n\r\n  if(!(await verificarPoliticaAceitaParaCnpj(cnpj))){\r\n    await exigirAceitePoliticaSeNecessario();\r\n    return;\r\n  }\r\n\r\n  const respostas = validarPesquisaObrigatoria();\r\n  if(!respostas) return;\r\n\r\n  const valor=Number(document.getElementById(\"uValor\").value);\r\n  const token=document.getElementById(\"uToken\").value.trim();\r\n  const novoContrato=document.getElementById(\"uNovoContrato\").value.trim();\r\n\r\n  if(!valor||valor<=0){alert(\"Informe um valor v\u00e1lido\");return;}\r\n  if(valor>saldoDisponivel){alert(\"Saldo insuficiente\");return;}\r\n  if(!token){alert(\"Informe o token\");return;}\r\n  if(!novoContrato){alert(\"Informe o novo contrato\");return;}\r\n\r\n  try{\r\n    const v = await validarTokenAtivoParaCnpj(token, cnpj);\r\n    if(!v.ok){ alert(v.msg); return; }\r\n\r\n    const tokenDoc = v.tokenDoc;\r\n    const tokenData = v.data;\r\n\r\n    await db.collection(SATISFACAO_COLLECTION).add({\r\n      titulo: \"Pesquisa de Satisfa\u00e7\u00e3o - Agisa Containers\",\r\n      cnpj: cnpj,\r\n      token: token,\r\n      contratoNovo: novoContrato,\r\n      contratoToken: tokenData.contrato || \"\",\r\n      respostas: respostas,\r\n      data_resposta: firebase.firestore.FieldValue.serverTimestamp(),\r\n      origem: \"area_cliente\"\r\n    });\r\n\r\n    await db.collection(\"uso_saldo\").add({\r\n      cnpj: cnpj,\r\n      valor: valor,\r\n      novoContrato: novoContrato,\r\n      token: token,\r\n      status: \"UTILIZADO\",\r\n      data: firebase.firestore.FieldValue.serverTimestamp()\r\n    });\r\n\r\n    await tokenDoc.ref.update({status:\"USADO\", usadoEm: firebase.firestore.FieldValue.serverTimestamp()});\r\n\r\n    fecharPesquisa();\r\n    alert(\"Pesquisa enviada e b\u00f4nus utilizado com sucesso!\");\r\n\r\n    document.getElementById(\"uValor\").value=\"\";\r\n    document.getElementById(\"uToken\").value=\"\";\r\n    document.getElementById(\"uNovoContrato\").value=\"\";\r\n    document.getElementById(\"formPesquisa\").reset();\r\n\r\n    consultarCarteira();\r\n  }catch(err){\r\n    console.error(err);\r\n    alert(\"Erro ao enviar pesquisa\/usar saldo. Verifique Rules e console.\");\r\n  }\r\n}\r\n\r\n\/* ===============================\r\n   \u2705 LISTENERS DO MODAL POL\u00cdTICA\r\n   =============================== *\/\r\ndocument.getElementById(\"btnAceitarPolitica\").addEventListener(\"click\", (e)=>{\r\n  e.preventDefault();\r\n  salvarAceitePolitica();\r\n});\r\ndocument.getElementById(\"btnSairPolitica\").addEventListener(\"click\", async (e)=>{\r\n  e.preventDefault();\r\n  try{ await auth.signOut(); }catch(_){}\r\n  location.reload();\r\n});\r\ndocument.getElementById(\"btnSairPoliticaTopo\").addEventListener(\"click\", async (e)=>{\r\n  e.preventDefault();\r\n  try{ await auth.signOut(); }catch(_){}\r\n  location.reload();\r\n});\r\ndocument.getElementById(\"respCpf\").addEventListener(\"input\", (e)=>{\r\n  const d = onlyDigits(e.target.value).slice(0,11);\r\n  const a = d.slice(0,3), b = d.slice(3,6), c = d.slice(6,9), x = d.slice(9,11);\r\n  let out = a;\r\n  if(b) out += \".\"+b;\r\n  if(c) out += \".\"+c;\r\n  if(x) out += \"-\"+x;\r\n  e.target.value = out;\r\n});\r\n<\/script>\r\n\r\n<\/body>\r\n<\/html>\r\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>AGISA | \u00c1rea do Cliente AGISA \u00c1rea do Cliente Carregando&#8230; Sair Acesso do Cliente Entrar E-mail Senha ENTRAR Esqueci minha senha Criar conta Criar cadastro CNPJ (vai ficar vinculado ao seu login) E-mail Senha Repetir senha CADASTRAR J\u00e1 tenho conta Consultar meus b\u00f4nus CNPJ Carregando seu CNPJ&#8230; VINCULAR CNPJ AO MEU LOGIN Isso evita ter [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":17,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-2","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/agisa.com.br\/bonus.agisa.com.br\/wp-json\/wp\/v2\/pages\/2","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/agisa.com.br\/bonus.agisa.com.br\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/agisa.com.br\/bonus.agisa.com.br\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/agisa.com.br\/bonus.agisa.com.br\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/agisa.com.br\/bonus.agisa.com.br\/wp-json\/wp\/v2\/comments?post=2"}],"version-history":[{"count":257,"href":"https:\/\/agisa.com.br\/bonus.agisa.com.br\/wp-json\/wp\/v2\/pages\/2\/revisions"}],"predecessor-version":[{"id":1694,"href":"https:\/\/agisa.com.br\/bonus.agisa.com.br\/wp-json\/wp\/v2\/pages\/2\/revisions\/1694"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/agisa.com.br\/bonus.agisa.com.br\/wp-json\/wp\/v2\/media\/17"}],"wp:attachment":[{"href":"https:\/\/agisa.com.br\/bonus.agisa.com.br\/wp-json\/wp\/v2\/media?parent=2"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}