{"id":1526,"date":"2025-08-18T10:01:46","date_gmt":"2025-08-18T13:01:46","guid":{"rendered":"https:\/\/indique.urbsaluga.com.br\/?page_id=1526"},"modified":"2025-09-03T08:43:17","modified_gmt":"2025-09-03T11:43:17","slug":"pagina-de-testes-campanha","status":"publish","type":"page","link":"https:\/\/indique.urbsaluga.com.br\/?page_id=1526","title":{"rendered":"Indique e Ganhe! &#8211; Cria\u00e7\u00e3o de Campanhas"},"content":{"rendered":"<p>    <!-- Bot\u00e3o Hamburguer -->\n    <div class=\"hamburguer-btn\" id=\"btn-menu-lateral\">\n        <div><\/div><div><\/div><div><\/div>\n    <\/div>\n\n    <!-- Overlay -->\n    <div class=\"overlay\" id=\"overlay-menu\"><\/div>\n\n    <!-- Menu lateral -->\n    <nav id=\"menu-id\" class=\"menu-class\">\n        <ul>\n                            <li><a href=\"https:\/\/indique.urbsaluga.com.br\/?page_id=1084\">Home<\/a><\/li>\n                            <li><a href=\"https:\/\/indique.urbsaluga.com.br\/?page_id=1080\">Lista de Colaboradores<\/a><\/li>\n                            <li><a href=\"https:\/\/indique.urbsaluga.com.br\/?page_id=1064\">Lista dos Embaixadores<\/a><\/li>\n                            <li><a href=\"https:\/\/indique.urbsaluga.com.br\/?page_id=1183\">Convers\u00f5es<\/a><\/li>\n                            <li><a href=\"https:\/\/indique.urbsaluga.com.br\/?page_id=1526\">Criar Campanha<\/a><\/li>\n                    <\/ul>\n    <\/nav>\n\n    <script>\n    document.addEventListener(\"DOMContentLoaded\", function() {\n        const btn = document.getElementById(\"btn-menu-lateral\");\n        const menu = document.getElementById(\"menu-id\");\n        const overlay = document.getElementById(\"overlay-menu\");\n\n        if (btn) btn.addEventListener(\"click\", () => {\n            menu.classList.toggle(\"active\");\n            overlay.style.display = menu.classList.contains(\"active\") ? \"block\" : \"none\";\n        });\n        if (overlay) overlay.addEventListener(\"click\", () => {\n            menu.classList.remove(\"active\");\n            overlay.style.display = \"none\";\n        });\n    });\n    <\/script>\n    <br \/>\n<div style=\"padding:12px;border:1px solid #eee;border-radius:8px\">Informe um c\u00f3digo de indica\u00e7\u00e3o.<\/div><br \/>\n\n    <script>\n      window.URBS_INDICACOES = window.URBS_INDICACOES || {\n        ajaxUrl: \"https:\\\/\\\/indique.urbsaluga.com.br\\\/wp-admin\\\/admin-ajax.php\",\n        nonce:   \"8f3ff2842d\",\n        i18n:    { ptBR: \"https:\\\/\\\/cdn.datatables.net\\\/plug-ins\\\/1.13.8\\\/i18n\\\/pt-BR.json\" }\n      };\n    <\/script>\n\n    \n      <form id=\"form-indicacao\" class=\"urbs-form-indicacao\" method=\"post\" action=\"\" enctype=\"multipart\/form-data\">\n    <fieldset>\n      <legend>Nova Indica\u00e7\u00e3o<\/legend>\n\n      <label for=\"Nome_Campanha\" class=\"urbs-label\">Nome da Indica\u00e7\u00e3o <span class=\"req\">*<\/span><\/label>\n      <input type=\"text\" id=\"Nome_Campanha\" name=\"Nome_Campanha\" class=\"urbs-input\" required placeholder=\"Ex.: Indica\u00e7\u00e3o Jo\u00e3o da Silva\">\n\n      <label for=\"Tipo_Campanha\" class=\"urbs-label\">Tipo da Indica\u00e7\u00e3o <span class=\"req\">*<\/span><\/label>\n      <select id=\"Tipo_Campanha\" name=\"Tipo_Campanha\" class=\"urbs-select\" required>\n        <option value=\"Inquilino\" selected>Inquilino<\/option>\n        <option value=\"Proprietario\">Propriet\u00e1rio<\/option>\n      <\/select>\n\n      <div class=\"urbs-grid\">\n        <div>\n          <fieldset class=\"urbs-box\">\n            <legend>Dados da Indica\u00e7\u00e3o<\/legend>\n            <label class=\"urbs-check\"><input type=\"checkbox\" class=\"chk-campo\" name=\"dados_indicacao[]\" value=\"nome\"><span id=\"lbl_nome_tipo\">Nome do Inquilino<\/span><\/label>\n            <label class=\"urbs-check\"><input type=\"checkbox\" class=\"chk-campo\" name=\"dados_indicacao[]\" value=\"numero\"><span id=\"lbl_numero_tipo\">N\u00famero do Inquilino<\/span><\/label>\n            <label class=\"urbs-check\"><input type=\"checkbox\" class=\"chk-campo\" name=\"dados_indicacao[]\" value=\"email\"><span id=\"lbl_email_tipo\">E-mail do Inquilino<\/span><\/label>\n            <label class=\"urbs-check\"><input type=\"checkbox\" class=\"chk-campo\" name=\"dados_indicacao[]\" value=\"vinculada\"><span>Indica\u00e7\u00e3o vinculada<\/span><\/label>\n            <label class=\"urbs-check\"><input type=\"checkbox\" class=\"chk-campo\" name=\"dados_indicacao[]\" value=\"cpf\"><span id=\"lbl_cpf_tipo\">CPF do Inquilino<\/span><\/label>\n            <label class=\"urbs-check\"><input type=\"checkbox\" class=\"chk-campo\" name=\"dados_indicacao[]\" value=\"fotos\"><span>Precisa de fotos<\/span><\/label>\n          <\/fieldset>\n        <\/div>\n\n        <div>\n          <fieldset class=\"urbs-box\">\n            <legend>Pr\u00e9-visualiza\u00e7\u00e3o dos Campos<\/legend>\n            <div id=\"preview_campos\" class=\"urbs-preview\"><\/div>\n            <p class=\"hint\">Ative os checkboxes ao lado para ver aqui os campos correspondentes.<\/p>\n          <\/fieldset>\n        <\/div>\n      <\/div>\n\n      <!-- Convers\u00f5es -->\n      <fieldset class=\"urbs-box\">\n        <legend>Convers\u00f5es (etapas\/momentos de pagamento)<\/legend>\n        <div id=\"conversoes_container\"><\/div>\n        <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" id=\"add_conversao\">+ Adicionar convers\u00e3o<\/button>\n      <\/fieldset>\n\n      <div class=\"urbs-actions\">\n        <button type=\"submit\" class=\"urbs-btn pri\">Salvar Indica\u00e7\u00e3o<\/button>\n      <\/div>\n    <\/fieldset>\n    <input type=\"hidden\" id=\"urbs_form_nonce\" name=\"urbs_form_nonce\" value=\"28361db4b6\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/index.php?rest_route=%2Fwp%2Fv2%2Fpages%2F1526\" \/>  <\/form>\n\n  <style>\n    .urbs-form-indicacao{max-width:900px;margin:16px 0;padding:20px;background:#fff;border:1px solid #e6e6e6;border-radius:12px}\n    .urbs-label{display:block;margin:14px 0 6px;font-weight:600}\n    .urbs-input,.urbs-select{width:100%;padding:10px 12px;border:1px solid #dcdcdc;border-radius:10px;font-size:14px}\n    .urbs-box{margin-top:16px;padding:14px;border:1px dashed #d6d6d6;border-radius:10px}\n    .urbs-check{display:flex;align-items:center;gap:8px;margin:8px 0}\n    .urbs-actions{display:flex;gap:10px;margin-top:16px;flex-wrap:wrap}\n    .urbs-btn{padding:10px 16px;border:0;border-radius:10px;font-weight:600;cursor:pointer}\n    .urbs-btn.pri{background:#2563eb;color:#fff}\n    .urbs-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}\n    @media (max-width: 820px){.urbs-grid{grid-template-columns:1fr}}\n    .urbs-preview .urbs-group{margin-bottom:10px}\n    .urbs-preview .urbs-group label{display:block;margin-bottom:6px;font-weight:600}\n\n    \/* cart\u00f5es simples para convers\u00f5es (sem depender de Bootstrap) *\/\n    .card{border:1px solid #e6e6e6;border-radius:10px;background:#fafafa;margin-bottom:10px}\n    .card .row{display: flex;grid-template-columns: repeat(12, 1fr);\n    gap: 10px;\n    flex-direction: column;}\n    .col-3{grid-column:span 3}\n    .col-4{grid-column:span 4}\n    .col-5{grid-column:span 5}\n    .col-12{grid-column:span 12}\n    .p-2{padding:12px}\n    .mb-2{margin-bottom:10px}\n    .btn{border:1px solid #dcdcdc;background:#fff;border-radius:8px;padding:6px 10px;cursor:pointer}\n    .btn-danger{background:#dc2626;color:#fff;border-color:#dc2626}\n    .btn-outline-primary{border-color:#2563eb;color:#2563eb;background:#fff}\n    .d-flex{display:flex;align-items:center;justify-content:space-between}\n    .form-control,.form-select{width:100%;padding:8px 10px;border:1px solid #dcdcdc;border-radius:8px}\n    .mb-2 > .d-flex{margin-bottom:8px}\n\t.urbs-box .form-control,\n\t.urbs-box .form-select { min-height: 44px; }\n\t.urbs-box legend { font-weight: 600; margin-bottom: .75rem; }\n\t.urbs-box .row.g-3 { --bs-gutter-y: 1rem; }\n\t.urbs-box input[type=\"text\"],\n\t.urbs-box input[type=\"number\"],\n\t.urbs-box input[type=\"email\"],\n\t.urbs-box input[type=\"file\"],\n\t.urbs-box select,\n\t.urbs-box textarea {\n\t  width: 400px;\n\t  max-width: 100%; \/* n\u00e3o estoura em telas menores *\/\n\t  box-sizing: border-box;\n\n\t}\n  <\/style>\n\n  <script>\n  (function(){\n    const el = id => document.getElementById(id);\n\n    const tipoSel = el('Tipo_Campanha');\n    const preview = el('preview_campos');\n\n    const lbls = {\n      nome:  el('lbl_nome_tipo'),\n      num:   el('lbl_numero_tipo'),\n      email: el('lbl_email_tipo'),\n      cpf:   el('lbl_cpf_tipo'),\n    };\n\n    \/\/ Atualiza r\u00f3tulos conforme tipo selecionado\n    function syncRotulos(){\n      const tipo = tipoSel.value === 'Proprietario' ? 'Propriet\u00e1rio' : 'Inquilino';\n      if (lbls.nome)  lbls.nome.textContent  = 'Nome do '   + tipo;\n      if (lbls.num)   lbls.num.textContent   = 'N\u00famero do ' + tipo;\n      if (lbls.email) lbls.email.textContent = 'E-mail do ' + tipo;\n      if (lbls.cpf)   lbls.cpf.textContent   = 'CPF do '    + tipo;\n    }\n    if (tipoSel) { tipoSel.addEventListener('change', syncRotulos); syncRotulos(); }\n\n    \/\/ Toggle dos campos para pr\u00e9-visualiza\u00e7\u00e3o\n    document.querySelectorAll('.chk-campo').forEach(chk=>{\n      chk.addEventListener('change', function(){\n        const v = this.value;\n        const exists = preview.querySelector('[data-item=\"'+v+'\"]');\n        if (this.checked && !exists){\n          let html = '';\n          if (v==='nome')      html = '<div class=\"urbs-group\" data-item=\"nome\"><label class=\"urbs-label\">Nome<\/label><input class=\"urbs-input\" name=\"nome_indicado\"><\/div>';\n          if (v==='numero')    html = '<div class=\"urbs-group\" data-item=\"numero\"><label class=\"urbs-label\">Telefone<\/label><input class=\"urbs-input\" name=\"telefone_indicado\"><\/div>';\n          if (v==='email')     html = '<div class=\"urbs-group\" data-item=\"email\"><label class=\"urbs-label\">E-mail<\/label><input type=\"email\" class=\"urbs-input\" name=\"email_indicado\"><\/div>';\n          if (v==='cpf')       html = '<div class=\"urbs-group\" data-item=\"cpf\"><label class=\"urbs-label\">CPF<\/label><input class=\"urbs-input\" name=\"cpf_indicado\"><\/div>';\n          if (v==='vinculada') html = '<div class=\"urbs-group\" data-item=\"vinculada\"><label class=\"urbs-label\">Indica\u00e7\u00e3o vinculada<\/label><input class=\"urbs-input\" name=\"indicacao_vinculada_ref\"><\/div>';\n          if (v==='fotos')     html = '<div class=\"urbs-group\" data-item=\"fotos\"><label class=\"urbs-label\">Fotos<\/label><input class=\"urbs-input\" type=\"file\" name=\"fotos_indicado[]\" multiple accept=\"image\/*\"><\/div>';\n          preview.insertAdjacentHTML('beforeend', html);\n        }\n        if (!this.checked && exists){ exists.remove(); }\n      });\n    });\n\n    \/\/ ===== Convers\u00f5es (corrigido) =====\n    const container = document.getElementById('conversoes_container');\n    const addBtn = document.getElementById('add_conversao');\n\n    function addConversao(data = {}) {\n\t   const idx = container.children.length + 1;\n\n\t  \/\/ \u2795 MAPA DE NOMES DESCRITIVOS POR MOMENTO\n\t  const momentoLabels = {\n\t\tindicacao: 'Indica\u00e7\u00e3o enviada',\n\t\tlead_qualificado: 'Lead qualificado',\n\t\tvisita: 'Visita',\n\t\tproposta: 'Proposta',\n\t\tcontrato: 'Contrato',\n\t\tparcela_1: '1\u00aa Parcela paga',\n\t\tparcela_n: 'N\u00aa Parcela paga',\n\t\toutro: 'Outro'\n\t  };\n\n\t  const d = Object.assign({\n\t\tuid: '',\n\t\t\/\/ \u2705 Fallback inteligente: nome \u2192 momento \u2192 gen\u00e9rico\n\t\tnome: data?.nome || momentoLabels[data?.momento || 'outro'] || `Convers\u00e3o ${idx}`,\n\t\tetapa: idx,\n\t\tmomento: 'indicacao',\n\t\ttipo: 'valor',\n\t\tvalor: '',\n\t\tpercentual: '',\n\t\tbase: 'aluguel',\n\t\tbase_custom: '',\n\t\tdescricao: ''\n\t  }, data || {});\n\t  const wrap = document.createElement('div');\n\t  wrap.className = \"card p-2 mb-2\";\n\n\t  wrap.innerHTML = `\n\t\t  <div class=\"d-flex mb-2 align-items-center justify-content-between\">\n\t\t\t<strong class=\"conv-titulo\"><\/strong>\n\t\t\t<button type=\"button\" class=\"btn btn-sm btn-danger btn-remove\" title=\"Remover\">Remover<\/button>\n\t\t  <\/div>\n\n\t\t  <div class=\"row g-2\">\n\t\t\t<input type=\"hidden\" name=\"conversoes[${idx}][uid]\" value=\"${d.uid||''}\">\n\n\t\t\t<div class=\"col-6\">\n\t\t\t  <label>Nome da convers\u00e3o\n\t\t\t\t<input type=\"text\" name=\"conversoes[${idx}][nome]\" value=\"${d.nome||''}\" class=\"form-control\" placeholder=\"Ex.: B\u00f4nus assinatura\">\n\t\t\t  <\/label>\n\t\t\t<\/div>\n\n\t\t\t<div class=\"col-3\">\n\t\t\t  <label>Etapa\n\t\t\t\t<input type=\"number\" name=\"conversoes[${idx}][etapa]\" value=\"${d.etapa}\" min=\"1\" class=\"form-control\">\n\t\t\t  <\/label>\n\t\t\t<\/div>\n\n\t\t\t<div class=\"col-5\">\n\t\t\t  <label>Momento\n\t\t\t\t<select name=\"conversoes[${idx}][momento]\" class=\"form-select momento-select\">\n\t\t\t\t  <option value=\"indicacao\" ${d.momento==='indicacao'?'selected':''}>Indica\u00e7\u00e3o enviada<\/option>\n\t\t\t\t  <option value=\"lead_qualificado\" ${d.momento==='lead_qualificado'?'selected':''}>Lead qualificado<\/option>\n\t\t\t\t  <option value=\"visita\" ${d.momento==='visita'?'selected':''}>Visita<\/option>\n\t\t\t\t  <option value=\"proposta\" ${d.momento==='proposta'?'selected':''}>Proposta<\/option>\n\t\t\t\t  <option value=\"contrato\" ${d.momento==='contrato'?'selected':''}>Contrato<\/option>\n\t\t\t\t  <option value=\"parcela_1\" ${d.momento==='parcela_1'?'selected':''}>1\u00aa Parcela paga<\/option>\n\t\t\t\t  <option value=\"parcela_n\" ${d.momento==='parcela_n'?'selected':''}>N\u00aa Parcela paga<\/option>\n\t\t\t\t  <option value=\"outro\" ${d.momento==='outro'?'selected':''}>Outro<\/option>\n\t\t\t\t<\/select>\n\t\t\t  <\/label>\n\t\t\t<\/div>\n\n\t\t\t<div class=\"col-4\">\n\t\t\t  <label>Tipo\n\t\t\t\t<select name=\"conversoes[${idx}][tipo]\" class=\"form-select tipo-select\">\n\t\t\t\t  <option value=\"valor\" ${d.tipo==='valor'?'selected':''}>Valor fixo (R$)<\/option>\n\t\t\t\t  <option value=\"porcentagem\" ${d.tipo==='porcentagem'?'selected':''}>Percentual (%)<\/option>\n\t\t\t\t<\/select>\n\t\t\t  <\/label>\n\t\t\t<\/div>\n\n\t\t\t<div class=\"col-4 grupo-valor\">\n\t\t\t  <label>Valor (R$)\n\t\t\t\t<input type=\"text\" name=\"conversoes[${idx}][valor]\" value=\"${d.valor||''}\" class=\"form-control\" placeholder=\"Ex.: 150,00\">\n\t\t\t  <\/label>\n\t\t\t<\/div>\n\n\t\t\t<div class=\"col-4 grupo-percentual\">\n\t\t\t  <label>Percentual (%)\n\t\t\t\t<input type=\"number\" step=\"0.01\" name=\"conversoes[${idx}][percentual]\" value=\"${d.percentual||''}\" class=\"form-control\" placeholder=\"Ex.: 10\">\n\t\t\t  <\/label>\n\t\t\t<\/div>\n\n\t\t\t<div class=\"col-4 grupo-percentual\">\n\t\t\t  <label>Base de c\u00e1lculo\n\t\t\t\t<select name=\"conversoes[${idx}][base]\" class=\"form-select base-select\">\n\t\t\t\t  <option value=\"aluguel\" ${d.base==='aluguel'?'selected':''}>Aluguel<\/option>\n\t\t\t\t  <option value=\"valor_contrato\" ${d.base==='valor_contrato'?'selected':''}>Valor do contrato<\/option>\n\t\t\t\t  <option value=\"taxa_admin\" ${d.base==='taxa_admin'?'selected':''}>Taxa de administra\u00e7\u00e3o<\/option>\n\t\t\t\t  <option value=\"custom\" ${d.base==='custom'?'selected':''}>Campo customizado<\/option>\n\t\t\t\t<\/select>\n\t\t\t  <\/label>\n\t\t\t<\/div>\n\n\t\t\t<div class=\"col-4 base-custom\">\n\t\t\t  <label>Chave do campo (custom)\n\t\t\t\t<input type=\"text\" name=\"conversoes[${idx}][base_custom]\" value=\"${d.base_custom||''}\" class=\"form-control\" placeholder=\"Ex.: receita_liquida\">\n\t\t\t  <\/label>\n\t\t\t<\/div>\n\n\t\t\t<!-- ===== PARCELAS (novo) ===== -->\n\t\t\t<div class=\"col-4\">\n\t\t\t\t  <label>Qtd. de parcelas\n\t\t\t\t\t<input type=\"number\" min=\"1\" value=\"${d.parcelas?.qtd || 1}\"\n\t\t\t\t\t\t   name=\"conversoes[${idx}][parcelas][qtd]\"\n\t\t\t\t\t\t   class=\"form-control parcelas-qtd\">\n\t\t\t\t  <\/label>\n\t\t\t\t<\/div>\n\n\t\t\t\t<div class=\"col-4\">\n\t\t\t\t  <label>Distribui\u00e7\u00e3o\n\t\t\t\t\t<select name=\"conversoes[${idx}][parcelas][distrib]\"\n\t\t\t\t\t\t\tclass=\"form-select parcelas-distrib\">\n\t\t\t\t\t  <option value=\"iguais\" ${d.parcelas?.distrib==='personalizadas'?'':'selected'}>Iguais<\/option>\n\t\t\t\t\t  <option value=\"personalizadas\" ${d.parcelas?.distrib==='personalizadas'?'selected':''}>Personalizadas<\/option>\n\t\t\t\t\t<\/select>\n\t\t\t\t  <\/label>\n\t\t\t\t<\/div>\n\n\t\t\t\t<div class=\"col-4 text-muted small\">\n\t\t\t\t  <span class=\"parcelas-hint\"><\/span>\n\t\t\t\t<\/div>\n\t\t\t  <\/div>\n\t\t\t<\/div>\n\n\t\t\t<div class=\"col-12\">\n\t\t\t  <div class=\"table-responsive\">\n\t\t\t\t<table class=\"table table-sm table-bordered mb-2 parcelas-tabela\">\n\t\t\t\t  <thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t  <th style=\"width:72px\">#<\/th>\n\t\t\t\t\t  <th class=\"th-parcela-label\"><\/th>\n\t\t\t\t\t<\/tr>\n\t\t\t\t  <\/thead>\n\t\t\t\t  <tbody class=\"parcelas-body\">\n\t\t\t\t\t<!-- gerado via JS -->\n\t\t\t\t  <\/tbody>\n\t\t\t\t<\/table>\n\t\t\t  <\/div>\n\t\t\t<\/div>\n\t\t\t<!-- ===== \/PARCELAS ===== -->\n\n\t\t\t<div class=\"col-12\">\n\t\t\t  <label>Descri\u00e7\u00e3o\n\t\t\t\t<input type=\"text\" name=\"conversoes[${idx}][descricao]\" value=\"${d.descricao||''}\" class=\"form-control\" placeholder=\"Ex.: b\u00f4nus na assinatura do contrato\">\n\t\t\t  <\/label>\n\t\t\t<\/div>\n\t\t  <\/div>\n\t\t`;\n\n\t  \/\/ remover\n\t  wrap.querySelector('.btn-remove').addEventListener('click', () => wrap.remove());\n\n\t  const selectTipo = wrap.querySelector('.tipo-select');\n\t\tconst baseSelect = wrap.querySelector('.base-select');\n\t\tconst grupoValor = wrap.querySelector('.grupo-valor');\n\t\tconst grupoPercs = wrap.querySelectorAll('.grupo-percentual');\n\t\tconst baseCustom = wrap.querySelector('.base-custom');\n\t\tconst nomeInput  = wrap.querySelector(`input[name=\"conversoes[${idx}][nome]\"]`);\n\t\tconst tituloEl   = wrap.querySelector('.conv-titulo');\n\t\t\/\/ refs novas (parcelas)\n\t\tconst parcelasQtd     = wrap.querySelector('.parcelas-qtd');\n\t\tconst parcelasDistrib = wrap.querySelector('.parcelas-distrib');\n\t\tconst parcelasBody    = wrap.querySelector('.parcelas-body');\n\t\tconst parcelasHint    = wrap.querySelector('.parcelas-hint');\n\t\tconst thParcelaLabel  = wrap.querySelector('.th-parcela-label');\n\n\t\t\/\/ \u2795 Nova refer\u00eancia (j\u00e1 existia no seu HTML)\n\t\tconst momentoSelect = wrap.querySelector('.momento-select');\n\n\t\t\/\/ ===== helpers dinheiro =====\n\t\tconst moneyToCents = (str) => {\n\t\t  if (!str) return 0;\n\t\t  const s = String(str).replace(\/\\.\/g,'').replace(',', '.');\n\t\t  const v = parseFloat(s);\n\t\t  return isNaN(v) ? 0 : Math.round(v * 100);\n\t\t};\n\t\tconst centsToMoney = (c) =>\n\t\t  (c\/100).toLocaleString('pt-BR', {minimumFractionDigits:2, maximumFractionDigits:2});\n\n\t\t\/\/ Valor base desta convers\u00e3o (para distribuir parcelas quando tipo = valor)\n\t\tfunction readValorBase() {\n\t\t  if (selectTipo.value === 'valor') {\n\t\t\tconst inp = wrap.querySelector(`input[name=\"conversoes[${idx}][valor]\"]`);\n\t\t\treturn moneyToCents(inp?.value || '0');\n\t\t  }\n\t\t  return 0; \/\/ tipo percentual n\u00e3o usa valor base\n\t\t}\n\n\t\t\/\/ monta linha de parcela\n\t\tfunction buildParcelaInput(i) {\n\t\t  const nameBase = `conversoes[${idx}][parcelas][itens][${i}]`;\n\t\t  const isValor  = (selectTipo.value === 'valor');\n\t\t  return `\n\t\t\t<tr>\n\t\t\t  <td style=\"width:72px\">Parc. ${i+1}<\/td>\n\t\t\t  <td>\n\t\t\t\t<input type=\"${isValor ? 'text':'number'}\"\n\t\t\t\t\t   ${isValor ? 'inputmode=\"numeric\"' : 'step=\"0.01\" min=\"0\"'}\n\t\t\t\t\t   class=\"form-control parcela-item\"\n\t\t\t\t\t   name=\"${nameBase}[${isValor ? 'valor':'percentual'}]\"\n\t\t\t\t\t   placeholder=\"${isValor ? 'Ex.: 150,00' : 'Ex.: 10,00'}\">\n\t\t\t  <\/td>\n\t\t\t<\/tr>`;\n\t\t}\n\n\t\t\/\/ (re)constr\u00f3i a pequena tabela de parcelas\n\t\tfunction renderParcelasTable() {\n\t\t  if (!parcelasBody) return;\n\t\t  const qtd = Math.max(1, parseInt(parcelasQtd?.value || '1', 10));\n\t\t  parcelasBody.innerHTML = Array.from({length: qtd})\n\t\t\t.map((_, i) => buildParcelaInput(i))\n\t\t\t.join('');\n\n\t\t  if (thParcelaLabel) {\n\t\t\tthParcelaLabel.textContent = (selectTipo.value === 'valor') ? 'Valor (R$)' : 'Percentual (%)';\n\t\t  }\n\t\t  distribuirParcelas();\n\t\t}\n\n\t\t\/\/ distribui (iguais\/personalizadas)\n\t\tfunction distribuirParcelas() {\n\t\t  if (!parcelasBody) return;\n\t\t  const distrib = parcelasDistrib?.value || 'iguais';\n\t\t  const inputs  = [...wrap.querySelectorAll('.parcela-item')];\n\n\t\t  if (distrib === 'personalizadas') {\n\t\t\tparcelasHint.textContent = (selectTipo.value === 'valor')\n\t\t\t  ? 'Informe os valores de cada parcela; a soma deve bater com o valor total.'\n\t\t\t  : 'Informe os percentuais; a soma deve ser 100%.';\n\t\t\treturn; \/\/ usu\u00e1rio vai preencher manualmente\n\t\t  }\n\n\t\t  \/\/ distribui\u00e7\u00e3o iguais\n\t\t  if (selectTipo.value === 'valor') {\n\t\t\tconst total = readValorBase(); \/\/ em centavos\n\t\t\tconst n = inputs.length;\n\t\t\tif (!n || total <= 0) {\n\t\t\t  parcelasHint.textContent = 'Preencha o valor total para distribuir igualmente.';\n\t\t\t  inputs.forEach(inp => inp.value = '');\n\t\t\t  return;\n\t\t\t}\n\t\t\tconst base = Math.floor(total \/ n);\n\t\t\tlet resto  = total - (base * n);\n\t\t\tinputs.forEach((inp) => {\n\t\t\t  let val = base;\n\t\t\t  if (resto > 0) { val += 1; resto -= 1; } \/\/ distribui centavos restantes\n\t\t\t  inp.value = centsToMoney(val);\n\t\t\t});\n\t\t\tparcelasHint.textContent = `Distribu\u00eddo igualmente em ${n}x (soma R$ ${centsToMoney(total)})`;\n\t\t  } else {\n\t\t\t\/\/ percentual\n\t\t\tconst n = inputs.length;\n\t\t\tconst pct = (100 \/ n);\n\t\t\tlet acum = 0;\n\t\t\tinputs.forEach((inp, i) => {\n\t\t\t  let v = (i === n-1) ? (100 - acum) : Math.round(pct * 100) \/ 100;\n\t\t\t  acum = Math.round((acum + v) * 100) \/ 100;\n\t\t\t  inp.value = v.toFixed(2);\n\t\t\t});\n\t\t\tparcelasHint.textContent = `Distribu\u00eddo igualmente em ${n}x (soma 100%)`;\n\t\t  }\n\t\t}\n\n\t\t\/\/ valida somat\u00f3rio\n\t\tfunction validarParcelas() {\n\t\t  const inputs  = [...wrap.querySelectorAll('.parcela-item')];\n\t\t  if (!inputs.length) return true;\n\n\t\t  if (selectTipo.value === 'valor') {\n\t\t\tconst soma = inputs.reduce((acc, inp) => acc + moneyToCents(inp.value), 0);\n\t\t\tconst total = readValorBase();\n\t\t\tconst ok = (total === 0) ? true : (soma === total);\n\t\t\tparcelasHint.textContent = ok\n\t\t\t  ? `OK: soma R$ ${centsToMoney(soma)}`\n\t\t\t  : `Aten\u00e7\u00e3o: soma R$ ${centsToMoney(soma)} diferente do total R$ ${centsToMoney(total)}`;\n\t\t\treturn ok;\n\t\t  } else {\n\t\t\tconst soma = inputs.reduce((acc, inp) => acc + (parseFloat(inp.value || '0')), 0);\n\t\t\tconst ok = Math.abs(soma - 100) < 0.01;\n\t\t\tparcelasHint.textContent = ok\n\t\t\t  ? `OK: soma ${soma.toFixed(2)}%`\n\t\t\t  : `Aten\u00e7\u00e3o: soma ${soma.toFixed(2)}% (deve ser 100%)`;\n\t\t\treturn ok;\n\t\t  }\n\t\t}\n\n\t\t\/\/ visibilidade dos grupos + integra parcelas\n\t\tfunction syncCampos(){\n\t\t  const isValor = (selectTipo.value === 'valor');\n\t\t  grupoValor.style.display = isValor ? 'block' : 'none';\n\t\t  grupoPercs.forEach(el => el.style.display = isValor ? 'none' : 'block');\n\t\t  baseCustom.style.display = (!isValor && baseSelect.value === 'custom') ? 'block' : 'none';\n\n\t\t  \/\/ \ud83d\udd01 parcelas: refaz grade e valida\n\t\t  renderParcelasTable();\n\t\t  validarParcelas();\n\t\t}\n\n\t\t\/\/ \u2705 T\u00cdTULO INTELIGENTE \u2014 sincroniza com input OU com o momento\n\t\tfunction syncTitulo(){\n\t\t  const nome = (nomeInput.value || '').trim();\n\t\t  if (nome) {\n\t\t\ttituloEl.textContent = nome;\n\t\t  } else {\n\t\t\tconst momento = momentoSelect.value;\n\t\t\ttituloEl.textContent = momentoLabels[momento] || `Convers\u00e3o ${idx}`;\n\t\t  }\n\t\t}\n\n\t\t\/\/ ===== Event listeners =====\n\t\tselectTipo.addEventListener('change', syncCampos);\n\t\tbaseSelect.addEventListener('change', syncCampos);\n\t\tnomeInput.addEventListener('input', syncTitulo);\n\t\tmomentoSelect.addEventListener('change', syncTitulo);\n\n\t\t\/\/ Parcelas\n\t\tif (parcelasQtd) parcelasQtd.addEventListener('input', renderParcelasTable);\n\t\tif (parcelasDistrib) parcelasDistrib.addEventListener('change', distribuirParcelas);\n\n\t\t\/\/ quando o valor total muda (tipo = valor) e distribui\u00e7\u00e3o = iguais \u2192 redistribui e valida\n\t\tif (selectTipo.value === 'valor') {\n\t\t  const valorInput = wrap.querySelector(`input[name=\"conversoes[${idx}][valor]\"]`);\n\t\t  if (valorInput) {\n\t\t\tvalorInput.addEventListener('input', () => {\n\t\t\t  if ((parcelasDistrib?.value || 'iguais') === 'iguais') distribuirParcelas();\n\t\t\t  validarParcelas();\n\t\t\t});\n\t\t  }\n\t\t}\n\n\t\t\/\/ revalida ao editar manualmente qualquer parcela\n\t\twrap.addEventListener('input', (ev) => {\n\t\t  if (ev.target.classList.contains('parcela-item')) validarParcelas();\n\t\t});\n\n\t\t\/\/ estados iniciais\n\t\tsyncCampos();\n\t\tsyncTitulo();\n\n\t\tcontainer.appendChild(wrap);\n\t}\n\n\n\n    if (addBtn) addBtn.addEventListener('click', ()=> addConversao());\n\n    \/\/ Se preferir j\u00e1 iniciar com 1 convers\u00e3o vis\u00edvel:\n    \/\/ addConversao();\n  })();\n  <\/script>\n          <script>console.log('URBS: Formul\u00e1rio carregado com URBS_INDICACOES:', window.URBS_INDICACOES);<\/script>\n      <br \/>\n<div class=\"urbs-cards-wrap\">\n  <div class=\"urbs-cards-toolbar\">\n    <input id=\"urbs-busca\" type=\"search\" placeholder=\"Buscar por nome, c\u00f3digo\u2026\" \/>\n    <button id=\"urbs-recarregar\" type=\"button\">Recarregar<\/button>\n  <\/div>\n\n  <div id=\"urbs-cards\" class=\"urbs-cards-grid\"><\/div>\n\n  <!-- Modal de edi\u00e7\u00e3o (reaproveita seu fluxo atual) -->\n  <div class=\"modal fade\" id=\"modalEditarIndicacao\" tabindex=\"-1\" aria-hidden=\"true\">\n    <div class=\"modal-dialog modal-lg modal-dialog-scrollable\">\n      <div class=\"modal-content\">\n        <div class=\"modal-header\">\n          <h5 class=\"modal-title\">Editar convers\u00f5es<\/h5>\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Fechar\"><\/button>\n        <\/div>\n        <div class=\"modal-body\">\n          <div id=\"modalEditarIndicacaoBody\"><div class=\"text-muted\">Carregando\u2026<\/div><\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<style>\n  .urbs-cards-wrap { max-width: 1200px; margin: 0 auto; }\n  .urbs-cards-toolbar { display:flex; gap:8px; margin:10px 0 16px; }\n  .urbs-cards-toolbar input { flex:1; padding:10px 12px; border:1px solid #dcdcdc; border-radius:10px; }\n  .urbs-cards-toolbar button { padding:10px 14px; border:0; border-radius:10px; background:#2563eb; color:#fff; font-weight:600; cursor:pointer; }\n\n  .urbs-cards-grid {\n    display:grid;\n    grid-template-columns: repeat(auto-fit, minmax(290px, 1fr));\n    gap:14px;\n  }\n  .urbs-card {\n    border:1px solid #e6e6e6; border-radius:14px; background:#fff; overflow:hidden;\n    box-shadow: 0 1px 4px rgba(0,0,0,.04);\n  }\n  .urbs-card-head {\n    padding:14px; cursor:pointer; display:flex; flex-direction:column; gap:8px;\n    background:linear-gradient(180deg, #fff, #fafafa);\n  }\n  .urbs-card-title { font-weight:700; font-size:16px; display:flex; align-items:center; gap:8px; }\n  .urbs-badge { font-size:12px; padding:2px 8px; border-radius:999px; background:#eef2ff; color:#3730a3; }\n  .urbs-kv { font-size:13px; color:#374151; display:flex; flex-wrap:wrap; gap:10px; }\n  .urbs-kv span { background:#f3f4f6; padding:4px 8px; border-radius:8px; }\n\n  .urbs-card-details { display:none; border-top:1px dashed #e5e7eb; padding:12px 14px; }\n  .urbs-conv-table { width:100%; border-collapse:separate; border-spacing:0 6px; }\n  .urbs-conv-table th { text-align:left; font-size:12px; color:#6b7280; padding:0 8px 4px; }\n  .urbs-conv-row { background:#f9fafb; border:1px solid #e5e7eb; border-radius:10px; }\n  .urbs-conv-row td { padding:8px; font-size:14px; }\n  .urbs-actions { display:flex; gap:8px; justify-content:flex-end; margin-top:10px; }\n  .urbs-btn { padding:8px 12px; border:0; border-radius:10px; font-weight:600; cursor:pointer; }\n  .urbs-btn.pri { background:#2563eb; color:#fff; }\n  .urbs-empty { text-align:center; color:#6b7280; padding:18px; }\n  .urbs-btn.danger { background:#dc2626; color:#fff; }\n\n<\/style>\n<script>\njQuery(function ($) {\n\n  \/\/ =========================\n  \/\/ CONFIG\n  \/\/ =========================\n  window.URBS_INDICACOES = window.URBS_INDICACOES || {};\n  URBS_INDICACOES.ajaxUrl = \"https:\\\/\\\/indique.urbsaluga.com.br\\\/wp-admin\\\/admin-ajax.php\";\n  URBS_INDICACOES.nonce   = \"8f3ff2842d\";\n\n  const $grid   = $(\"#urbs-cards\");\n  const $modal  = $(\"#modalEditarIndicacao\");\n  const $body   = $(\"#modalEditarIndicacaoBody\");\n\n  \/\/ =========================\n  \/\/ HELPERS\n  \/\/ =========================\n  function esc(t) {\n    if (t === null || t === undefined) t = '';\n    return String(t)\n      .replace(\/&\/g, \"&amp;\")\n      .replace(\/<\/g, \"&lt;\")\n      .replace(\/>\/g, \"&gt;\")\n      .replace(\/\"\/g, \"&quot;\")\n      .replace(\/'\/g, \"&#039;\");\n  }\n\n  function moneyBR(v){\n    if (v === null || v === undefined || v === '') return '';\n    const n = parseFloat(v);\n    if (isNaN(n)) return '';\n    return 'R$ ' + n.toLocaleString('pt-BR',{minimumFractionDigits:2, maximumFractionDigits:2});\n  }\n\n  function percentBR(v){\n    if (v === null || v === undefined || v === '') return '';\n    const n = parseFloat(v);\n    if (isNaN(n)) return '';\n    return n.toLocaleString('pt-BR',{maximumFractionDigits:2}) + '%';\n  }\n\n  \/\/ =========================\n  \/\/ MODAL BLINDADO\n  \/\/ MODAL BLINDADO (FIX)\n  \/\/ =========================\n  let modalInst = null;\n  \n  function ensureModal() {\n    \/\/ se n\u00e3o existe modal no DOM, n\u00e3o quebra\n    if (!$modal.length || !$modal[0]) {\n      return { show(){}, hide(){} };\n    }\n\n    if (modalInst) return modalInst;\n\n    \/\/ Bootstrap 5\n    if (window.bootstrap && typeof window.bootstrap.Modal === \"function\") {\n      modalInst = window.bootstrap.Modal.getOrCreateInstance($modal[0], {\n        backdrop: true,\n        keyboard: true\n      });\n      return modalInst;\n    }\n\n    \/\/ Bootstrap 4 (jQuery plugin)\n    if (typeof $modal.modal === \"function\") {\n      modalInst = {\n        show: () => $modal.modal(\"show\"),\n        hide: () => $modal.modal(\"hide\")\n      };\n      return modalInst;\n    }\n\n    \/\/ fallback simples\n    modalInst = {\n      show: () => $modal.show(),\n      hide: () => $modal.hide()\n    };\n    return modalInst;\n  }\n  \n  function showModal(){ ensureModal().show(); }\n  function hideModal(){ ensureModal().hide(); }\n\n\n  \/\/ =========================\n  \/\/ RENDER CARD COMPLETO\n  function renderCard(r) {\n\t  const isAtiva = Number(r.Campanha_ativa) === 1;\n\n\t  const valorOuPerc =\n\t\t(r.Tipo_Ganho === \"valor\")\n\t\t  ? moneyBR(r.Valor_Ganho)\n\t\t  : percentBR(r.Percentual_Ganho);\n\n\t  \/\/ Convers\u00f5es (JSON)\n\t  let convs = [];\n\t  try { convs = r.conversoes_json ? JSON.parse(r.conversoes_json) : []; } catch(e){ convs = []; }\n\t  const convCount = Array.isArray(convs) ? convs.length : 0;\n\n\t  const convRows = convCount\n\t\t? convs.map(cv => `\n\t\t\t<tr class=\"urbs-conv-row\">\n\t\t\t  <td>${esc(cv.etapa ?? \"\")}<\/td>\n\t\t\t  <td>${esc(cv.nome ?? cv.etapa_nome ?? \"\")}<\/td>\n\t\t\t  <td>${\n\t\t\t\tcv.tipo === \"valor\"\n\t\t\t\t  ? esc(moneyBR(cv.valor))\n\t\t\t\t  : (cv.tipo === \"porcentagem\" ? esc(percentBR(cv.percentual)) : \"\")\n\t\t\t  }<\/td>\n\t\t\t  <td>${esc(cv.descricao ?? \"\")}<\/td>\n\t\t\t<\/tr>\n\t\t  `).join(\"\")\n\t\t: \"\";\n\n\t  const statusBadge = isAtiva\n\t\t? `<span class=\"urbs-badge ok\" data-role=\"badge-status\">ATIVA<\/span>`\n\t\t: `<span class=\"urbs-badge off\" data-role=\"badge-status\">DESATIVADA<\/span>`;\n\n\t  const toggleText = isAtiva ? \"Desativar campanha\" : \"Ativar campanha\";\n\t  const toggleNext = isAtiva ? 0 : 1;\n\n\t  const head = `\n\t\t<div class=\"urbs-card-head\" data-role=\"toggle\">\n\t\t  <div class=\"urbs-card-title\">\n\t\t\t<span>${esc(r.Nome_Campanha || \"\")}<\/span>\n\t\t\t${r.Codigo_Campanha ? `<span class=\"urbs-badge\">#${esc(r.Codigo_Campanha)}<\/span>` : \"\"}\n\t\t\t${statusBadge}\n\t\t  <\/div>\n\n\t\t  <div class=\"urbs-kv\">\n\t\t\t<span><strong>Tipo ganho:<\/strong> ${esc(r.Tipo_Ganho || \"\")}<\/span>\n\t\t\t<span><strong>Valor\/%:<\/strong> ${esc(valorOuPerc)}<\/span>\n\t\t\t${r.Parcelas_Campanha ? `<span><strong>Parcelas:<\/strong> ${esc(r.Parcelas_Campanha)}<\/span>` : \"\"}\n\t\t\t<span><strong>Convers\u00f5es:<\/strong> <span data-role=\"conv-count\">${esc(convCount)}<\/span><\/span>\n\t\t  <\/div>\n\t\t<\/div>\n\t  `;\n\n\t  const details = `\n\t\t<div class=\"urbs-card-details\" data-role=\"details\" style=\"display:none;\">\n\n\t\t  ${\n\t\t\tconvCount\n\t\t\t  ? `<div class=\"table-responsive\">\n\t\t\t\t  <table class=\"urbs-conv-table\">\n\t\t\t\t\t<thead>\n\t\t\t\t\t  <tr>\n\t\t\t\t\t\t<th>Etapa<\/th>\n\t\t\t\t\t\t<th>Nome da convers\u00e3o<\/th>\n\t\t\t\t\t\t<th>Valor<\/th>\n\t\t\t\t\t\t<th>Descri\u00e7\u00e3o<\/th>\n\t\t\t\t\t  <\/tr>\n\t\t\t\t\t<\/thead>\n\t\t\t\t\t<tbody>${convRows}<\/tbody>\n\t\t\t\t  <\/table>\n\t\t\t\t<\/div>`\n\t\t\t  : `<div class=\"urbs-empty\">Nenhuma convers\u00e3o cadastrada.<\/div>`\n\t\t  }\n\n\t\t  <div class=\"urbs-actions\" style=\"margin-top:10px;\">\n\t\t\t<button type=\"button\"\n\t\t\t  class=\"urbs-btn ${isAtiva ? \"warn\" : \"pri\"}\"\n\t\t\t  data-role=\"toggle-campanha\"\n\t\t\t  data-id=\"${esc(r.id)}\"\n\t\t\t  data-ativa=\"${esc(toggleNext)}\">\n\t\t\t  ${esc(toggleText)}\n\t\t\t<\/button>\n\n\t\t\t<button type=\"button\" class=\"urbs-btn pri\" data-role=\"editar-conversoes\" data-id=\"${esc(r.id)}\">\n\t\t\t  Editar convers\u00f5es\n\t\t\t<\/button>\n\n\t\t\t<button type=\"button\" class=\"urbs-btn danger\" data-role=\"excluir-indicacao\"\n\t\t\t  data-id=\"${esc(r.id)}\"\n\t\t\t  data-codigo=\"${esc(r.Codigo_Campanha || \"\")}\"\n\t\t\t  data-nome=\"${esc(r.Nome_Campanha || \"\")}\">\n\t\t\t  Excluir\n\t\t\t<\/button>\n\n\t\t\t${\n\t\t\t  r.Codigo_Campanha\n\t\t\t\t? `<a class=\"urbs-btn\" target=\"_blank\" rel=\"noopener\"\n\t\t\t\t\t href=\"${location.href.split(\"?\")[0]}?Codigo_Campanha=${encodeURIComponent(r.Codigo_Campanha)}\">\n\t\t\t\t\t Ver formul\u00e1rio\n\t\t\t\t   <\/a>`\n\t\t\t\t: ``\n\t\t\t}\n\t\t  <\/div>\n\t\t<\/div>\n\t  `;\n\n\t  return `<div class=\"urbs-card\" data-id=\"${esc(r.id)}\" data-ativa=\"${isAtiva ? 1 : 0}\">${head}${details}<\/div>`;\n\t}\n\n\n  \/\/ =========================\n  \/\/ EVENTS (1x s\u00f3)\n  function bindEvents() {\n\t  \/\/ Toggle abre\/fecha\n\t  $grid.off(\"click\", \"[data-role='toggle']\").on(\"click\", \"[data-role='toggle']\", function (e) {\n\t\tif ($(e.target).closest(\"button,a,input,select,textarea,label\").length) return;\n\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tconst $card = $(this).closest(\".urbs-card\");\n\t\t$card.find(\"[data-role='details']\").first().stop(true,true).slideToggle(160);\n\t  });\n\n\t  \/\/ Clique dentro do details n\u00e3o fecha\n\t  $grid.off(\"click\", \"[data-role='details']\").on(\"click\", \"[data-role='details']\", function (e) {\n\t\te.stopPropagation();\n\t  });\n\n\t  \/\/ EDITAR (abre modal e carrega HTML)\n\t  $grid.off(\"click\", \"[data-role='editar-conversoes']\").on(\"click\", \"[data-role='editar-conversoes']\", function (e) {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tconst id = $(this).data(\"id\");\n\t\tif (!id) return;\n\n\t\tshowModal();\n\t\t$body.html('<div class=\"text-muted\">Carregando...<\/div>');\n\n\t\t$.post(URBS_INDICACOES.ajaxUrl, {\n\t\t  action: \"urbs_get_indicacao_form\",\n\t\t  security: URBS_INDICACOES.nonce,\n\t\t  id: id\n\t\t}).done(function (resp) {\n\t\t  $body.html(resp && resp.success ? resp.data.html : '<div class=\"text-danger\">Erro ao carregar.<\/div>');\n\t\t}).fail(function () {\n\t\t  $body.html('<div class=\"text-danger\">Falha na comunica\u00e7\u00e3o.<\/div>');\n\t\t});\n\t  });\n\n\t  \/\/ \u2705 SALVAR (submit do form dentro do modal) -------------\n\t  \/\/ Delegado porque o form entra via $body.html(...)\n\t  $(document)\n\t\t.off(\"submit\", \"#form-editar-indicacao\")\n\t\t.on(\"submit\", \"#form-editar-indicacao\", function (e) {\n\t\t  e.preventDefault();\n\n\t\t  const $form = $(this);\n\t\t  const fd = new FormData($form[0]);\n\n\t\t  \/\/ for\u00e7a action e nonce corretos\n\t\t  fd.set(\"action\", \"urbs_salvar_indicacao\");\n\n\t\t  const sec = $form.find(\"input[name='security']\").val() || URBS_INDICACOES.nonce;\n\t\t  fd.set(\"security\", sec);\n\n\t\t  const $btn = $form.find(\"button[type='submit']\").first();\n\t\t  const oldTxt = $btn.text();\n\t\t  $btn.prop(\"disabled\", true).text(\"Salvando...\");\n\n\t\t  $.ajax({\n\t\t\turl: URBS_INDICACOES.ajaxUrl,\n\t\t\tmethod: \"POST\",\n\t\t\tdata: fd,\n\t\t\tprocessData: false,\n\t\t\tcontentType: false\n\t\t  })\n\t\t  .done(function (resp) {\n\t\t\tif (resp && resp.success) {\n\t\t\t  alert(resp?.data?.msg || \"Salvo com sucesso!\");\n\t\t\t  hideModal();\n\t\t\t  carregarIndicacoes(); \/\/ atualiza a lista\n\t\t\t} else {\n\t\t\t  alert(resp?.data?.msg || \"Erro ao salvar.\");\n\t\t\t}\n\t\t  })\n\t\t  .fail(function (xhr) {\n\t\t\tconsole.log(\"AJAX FAIL:\", xhr.responseText);\n\t\t\talert(\"Falha na comunica\u00e7\u00e3o ao salvar.\");\n\t\t  })\n\t\t  .always(function () {\n\t\t\t$btn.prop(\"disabled\", false).text(oldTxt);\n\t\t  });\n\t\t});\n\t  \/\/ -------------------------------------------------------\n\n\t  \/\/ EXCLUIR\n\t  $grid.off(\"click\", \"[data-role='excluir-indicacao']\").on(\"click\", \"[data-role='excluir-indicacao']\", function (e) {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tconst $btn = $(this);\n\t\tconst id = $btn.data(\"id\");\n\t\tconst codigo = $btn.data(\"codigo\") || \"\";\n\t\tconst nome = $btn.data(\"nome\") || \"\";\n\n\t\tif (!id) return;\n\n\t\tconst ok = confirm(`Excluir a indica\u00e7\u00e3o?\\n\\n${nome}\\n${codigo ? (\"C\u00f3digo: \" + codigo) : \"\"}\\n\\nEssa a\u00e7\u00e3o n\u00e3o pode ser desfeita.`);\n\t\tif (!ok) return;\n\n\t\tconst txt = $btn.text();\n\t\t$btn.prop(\"disabled\", true).text(\"Excluindo\u2026\");\n\n\t\t$.post(URBS_INDICACOES.ajaxUrl, {\n\t\t  action: \"urbs_excluir_indicacao\",\n\t\t  security: URBS_INDICACOES.nonce,\n\t\t  id: id\n\t\t}).done(function (resp) {\n\t\t  if (resp && resp.success) {\n\t\t\t$btn.closest(\".urbs-card\").remove();\n\t\t  } else {\n\t\t\talert(resp?.data?.msg || \"Erro ao excluir.\");\n\t\t\t$btn.prop(\"disabled\", false).text(txt);\n\t\t  }\n\t\t}).fail(function () {\n\t\t  alert(\"Falha na comunica\u00e7\u00e3o ao excluir.\");\n\t\t  $btn.prop(\"disabled\", false).text(txt);\n\t\t});\n\t  });\n\n\t  \/\/ ATIVAR\/DESATIVAR CAMPANHA\n\t  $grid.off(\"click\", \"[data-role='toggle-campanha']\").on(\"click\", \"[data-role='toggle-campanha']\", function (e) {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tconst $btn = $(this);\n\t\tconst id = $btn.data(\"id\");\n\t\tconst ativa = Number($btn.data(\"ativa\"));\n\n\t\tif (!id) return;\n\n\t\tconst txt = $btn.text();\n\t\t$btn.prop(\"disabled\", true).text(\"Salvando...\");\n\n\t\t$.post(URBS_INDICACOES.ajaxUrl, {\n\t\t  action: \"urbs_toggle_campanha\",\n\t\t  security: URBS_INDICACOES.nonce,\n\t\t  id: id,\n\t\t  ativa: ativa\n\t\t}).done(function (resp) {\n\t\t  if (resp && resp.success) {\n\t\t\tconst $card = $btn.closest(\".urbs-card\");\n\t\t\tconst isAtiva = ativa === 1;\n\n\t\t\t$card.attr(\"data-ativa\", isAtiva ? 1 : 0);\n\n\t\t\tconst $badge = $card.find(\"[data-role='badge-status']\").first();\n\t\t\t$badge.text(isAtiva ? \"ATIVA\" : \"DESATIVADA\");\n\n\t\t\t$btn\n\t\t\t  .data(\"ativa\", isAtiva ? 0 : 1)\n\t\t\t  .removeClass(\"pri warn\")\n\t\t\t  .addClass(isAtiva ? \"warn\" : \"pri\")\n\t\t\t  .text(isAtiva ? \"Desativar campanha\" : \"Ativar campanha\");\n\n\t\t  } else {\n\t\t\talert(resp?.data?.msg || \"Erro ao alterar status.\");\n\t\t\t$btn.text(txt);\n\t\t  }\n\t\t}).fail(function () {\n\t\t  alert(\"Falha na comunica\u00e7\u00e3o.\");\n\t\t  $btn.text(txt);\n\t\t}).always(function () {\n\t\t  $btn.prop(\"disabled\", false);\n\t\t});\n\t  });\n\t}\n\n  \/\/ =========================\n  \/\/ CARREGAR DADOS\n  \/\/ =========================\n  function carregarIndicacoes() {\n    if (!$grid.length) return;\n\n    $grid.html('<div class=\"urbs-empty\">Carregando...<\/div>');\n\n    $.post(URBS_INDICACOES.ajaxUrl, {\n      action: 'urbs_listar_indicacoes',\n      security: URBS_INDICACOES.nonce\n    }).done(function(resp){\n\n      const rows = (resp && resp.data && Array.isArray(resp.data.rows)) ? resp.data.rows : [];\n\n      if (!rows.length){\n        $grid.html('<div class=\"urbs-empty\">Nenhuma indica\u00e7\u00e3o encontrada<\/div>');\n        return;\n      }\n\n      $grid.empty();\n      rows.forEach(r => $grid.append(renderCard(r)));\n\n    }).fail(function(){\n      $grid.html('<div class=\"urbs-empty\">Erro ao carregar<\/div>');\n    });\n  }\n\n  \/\/ =========================\n  \/\/ START\n  \/\/ =========================\n  bindEvents();\n  carregarIndicacoes();\n\n});\n<\/script>\n\n<\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1526","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/indique.urbsaluga.com.br\/index.php?rest_route=\/wp\/v2\/pages\/1526","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/indique.urbsaluga.com.br\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/indique.urbsaluga.com.br\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/indique.urbsaluga.com.br\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/indique.urbsaluga.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1526"}],"version-history":[{"count":8,"href":"https:\/\/indique.urbsaluga.com.br\/index.php?rest_route=\/wp\/v2\/pages\/1526\/revisions"}],"predecessor-version":[{"id":1572,"href":"https:\/\/indique.urbsaluga.com.br\/index.php?rest_route=\/wp\/v2\/pages\/1526\/revisions\/1572"}],"wp:attachment":[{"href":"https:\/\/indique.urbsaluga.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1526"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}