chore(tenants): conteudo de publico/ atualizado

This commit is contained in:
deploy
2026-09-29 19:38:10 +00:00
parent b0b40e8d1a
commit f61e157e88
2 changed files with 70 additions and 34 deletions
+35 -17
View File
@@ -1801,7 +1801,7 @@ data:
<footer class="direitos">&copy; 2026 Athletic Map. Todos os direitos reservados.</footer>
<script src="/publico/minha-conta.js?v=2.88"></script>
<script src="/publico/minha-conta.js?v=2.89"></script>
</body>
</html>
@@ -1988,14 +1988,18 @@ data:
return n ? n.charAt(0).toUpperCase() + n.slice(1) : "—";
}
/* Tenant de DEMONSTRACAO do dono: o servidor marca (`demonstracao: true`). O
cartao diz isso ao lado da situacao, e nao ganha "Trocar de plano" nem
"Modulos avulsos" — nao ha cobranca, e o servidor recusaria de qualquer jeito. */
function cartao(p) {
var s = SITUACAO[p.situacao] || ["neutro", String(p.situacao || "").toLowerCase()];
var podeEntrar = p.endereco && p.situacao === "ATIVA";
return '<article class="produto ' + classeDoPlano(p.plano) + '"'
return '<article class="produto ' + classeDoPlano(p.plano) + (p.demonstracao ? " demonstracao" : "") + '"'
+ (p.tenant ? ' data-tenant="' + escapar(p.tenant) + '"' : "") + ">"
+ '<span class="faixa-plano">Plano ' + escapar(nomeDoPlano(p.plano)) + "</span>"
+ "<h2>" + escapar(p.escolinha || "Sua escolinha") + "</h2>"
+ '<span class="selo ' + s[0] + '">' + s[1] + "</span>"
+ (p.demonstracao ? '<span class="selo neutro">demonstra&ccedil;&atilde;o &mdash; sem cobran&ccedil;a</span>' : "")
+ (podeEntrar
? '<a class="btn" href="' + escapar(p.endereco) + '">Entrar &rarr;</a>'
: '<p class="ajuda">' + (p.situacao === "PREPARANDO"
@@ -2017,7 +2021,9 @@ data:
produtos.innerHTML = (lista || []).map(cartao).join("");
nenhum.classList.toggle("oculto", (lista || []).length > 0);
mostrar(conteudo);
(lista || []).forEach(function (p) { if (p.tenant && p.situacao === "ATIVA") acrescentarBotaoDePlano(p.tenant); });
(lista || []).forEach(function (p) {
if (p.tenant && p.situacao === "ATIVA" && !p.demonstracao) acrescentarBotaoDePlano(p.tenant);
});
return Promise.all([carregarCobranca(), carregarTermo(), carregarFaturas(), carregarVisao(),
carregarTermosDeUso()]);
});
@@ -3171,7 +3177,7 @@ data:
<option value="NASCENDO">Nascendo</option>
</select>
<label class="filtro"><input type="checkbox" id="soAtencao"> só com alerta</label>
<label class="filtro"><input type="checkbox" id="semTeste"> esconder testes</label>
<label class="filtro"><input type="checkbox" id="semTeste"> esconder testes e demonstrações</label>
</div>
<div class="tabela-rolagem">
<table class="tabela clientes">
@@ -3334,7 +3340,7 @@ data:
</main>
<script src="/publico/painel.js?v=2.86"></script>
<script src="/publico/painel.js?v=2.87"></script>
</body>
</html>
@@ -3630,9 +3636,13 @@ data:
bloco("Recebido desde o início", reaisCurto(i.recebidoTotal),
i.clientesSemDadoDoAsaas > 0 ? i.clientesSemDadoDoAsaas + " sem resposta do Asaas" : "extrato do Asaas", "")
].join("");
// Teste e demonstracao aparecem na lista, mas nao nos numeros — e a tela diz.
var foraDosNumeros = [];
if (i.contasDeTeste > 0) foraDosNumeros.push(i.contasDeTeste + " de teste");
if (i.demonstracoes > 0) foraDosNumeros.push(i.demonstracoes + " de demonstração");
$("kpiClientes").innerHTML = [
bloco("Clientes ativos", esc(i.clientesAtivos),
i.contasDeTeste > 0 ? "+ " + i.contasDeTeste + " de teste (fora dos números)" : "", "ok"),
foraDosNumeros.length ? "+ " + foraDosNumeros.join(", ") + " (fora dos números)" : "", "ok"),
bloco("Novos no mês", esc(i.novosNoMes), comparacao(i.novosNoMes, i.novosMesAnterior), ""),
bloco("Leads no mês", esc(i.leadsNoMes), comparacao(i.leadsNoMes, i.leadsMesAnterior), ""),
bloco("Conversão", pct(i.conversao), "de lead para cliente pagante", ""),
@@ -3671,7 +3681,7 @@ data:
if (plano && c.plano !== plano) return false;
if (estado && (c.estado || "NASCENDO") !== estado) return false;
if (soAtencao && !(c.alertas || []).length) return false;
if (semTeste && c.teste) return false;
if (semTeste && (c.teste || c.demonstracao)) return false;
if (busca) {
var alvo = [c.cliente, c.escolinha, c.email, c.cidade, c.tenant, c.whatsapp, c.documento]
.join(" ").toLowerCase();
@@ -3701,7 +3711,9 @@ data:
}
var SITUACAO_ASAAS = { ACTIVE: "ativa", INACTIVE: "encerrada", EXPIRED: "expirada" };
function assinaturaNoAsaas(a) {
/* A demonstracao nao existe no Asaas DE PROPOSITO: nao e "nao existe" em vermelho. */
function assinaturaNoAsaas(a, c) {
if (c && c.demonstracao) return "demonstração — sem cobrança";
if (!a || !a.disponivel) return "indisponível agora";
if (!a.existe) return '<b class="vermelho">não existe</b>';
var s = SITUACAO_ASAAS[a.situacao] || txt(a.situacao);
@@ -3738,10 +3750,11 @@ data:
var gravidade = (c.alertas || []).reduce(function (g, a) {
return a.gravidade === "critico" ? "critico" : (g === "critico" ? g : (a.gravidade === "alerta" ? "alerta" : g));
}, "");
return '<tr class="clicavel' + (gravidade ? " linha-" + gravidade : "") + (c.teste ? " teste" : "")
return '<tr class="clicavel' + (gravidade ? " linha-" + gravidade : "") + (c.teste || c.demonstracao ? " teste" : "")
+ (!c.tenant ? " destaque" : "") + '" data-assinatura="' + esc(c.assinatura) + '" tabindex="0">'
+ "<td><b>" + txt(c.cliente) + "</b>"
+ (c.teste ? ' <span class="selo neutro">teste</span>' : "")
+ (c.demonstracao ? ' <span class="selo neutro">demonstração</span>' : "")
+ '<span class="sub">' + (c.tenant
? '<a href="' + esc(c.endereco) + '" target="_blank" rel="noopener noreferrer">' + esc(c.tenant) + "</a>"
: "sem tenant")
@@ -3750,9 +3763,9 @@ data:
+ "<td>" + etiquetaPlano(c) + "</td>"
+ "<td>" + selo(c.estado, c.tenant) + '<span class="sub">' + (c.diasDeCliente !== null && c.diasDeCliente !== undefined
? "cliente há " + esc(c.diasDeCliente) + " dia(s)" : "") + "</span></td>"
+ '<td class="num">' + reais(c.valorMensal) + diferencaDeTabela(c) + "</td>"
+ '<td class="num">' + (f.disponivel ? reais(f.totalPago) + '<span class="sub">' + esc(f.cobrancasPagas) + " cobrança(s)</span>" : "—") + "</td>"
+ "<td>" + proximaCobranca(f) + "</td>"
+ '<td class="num">' + (c.demonstracao ? '<span class="ajuda">sem cobrança</span>' : reais(c.valorMensal) + diferencaDeTabela(c)) + "</td>"
+ '<td class="num">' + (c.demonstracao ? "—" : f.disponivel ? reais(f.totalPago) + '<span class="sub">' + esc(f.cobrancasPagas) + " cobrança(s)</span>" : "—") + "</td>"
+ "<td>" + (c.demonstracao ? '<span class="ajuda">—</span>' : proximaCobranca(f)) + "</td>"
+ "<td>" + usoCurto(c.uso, c.usoDeDentro) + "</td>"
+ "<td>" + seloSubconta(c.subconta) + "</td>"
+ "</tr>";
@@ -3778,7 +3791,9 @@ data:
+ esc(a.titulo) + '</b><span class="sub">' + esc(a.detalhe) + "</span></div></li>";
}).join("");
var extrato = f.disponivel
var extrato = c.demonstracao
? '<p class="ajuda">Tenant de demonstração: não há assinatura nem cobrança no Asaas.</p>'
: f.disponivel
? ((f.cobrancas || []).length
? '<table class="tabela"><thead><tr><th>Vencimento</th><th>Pago em</th><th>Forma</th><th class="num">Valor</th><th class="num">Líquido</th><th>Situação</th><th></th></tr></thead><tbody>'
+ f.cobrancas.map(function (cb) {
@@ -3799,7 +3814,7 @@ data:
return '<header class="ficha-topo ' + classePlano(c.plano) + '">'
+ '<span class="etiqueta ' + classePlano(c.plano) + '">Plano ' + esc(nomePlano(c.plano))
+ (c.ciclo === "ANUAL" ? " · anual" : " · mensal") + "</span>"
+ '<h2 id="fichaTitulo">' + txt(c.cliente) + "</h2>"
+ '<h2 id="fichaTitulo">' + txt(c.cliente) + (c.demonstracao ? ' <span class="selo neutro">demonstração</span>' : "") + "</h2>"
+ '<p class="sub">' + (c.escolinha && c.escolinha !== c.cliente ? esc(c.escolinha) + " · " : "")
+ selo(c.estado, c.tenant) + (c.estadoDesde ? " desde " + dataHora(c.estadoDesde) : "") + "</p>"
+ '<div class="atalhos">'
@@ -3821,14 +3836,17 @@ data:
+ '<section><h3>Assinatura</h3><dl>'
+ item("Plano", esc(nomePlano(c.plano)) + " " + (c.ciclo === "ANUAL" ? "anual" : "mensal"))
+ item("Valor do ciclo", reais(c.valorDoCiclo)) + item("Vale por mês", reais(c.valorMensal) + diferencaDeTabela(c))
+ item("De onde vem o valor", c.valorDaFonte === "asaas" ? "a assinatura no Asaas" : "a tabela de preços (Asaas não respondeu)")
+ item("Situação no Asaas", assinaturaNoAsaas(c.assinaturaNoAsaas))
+ item("De onde vem o valor", c.demonstracao ? "demonstração — sem cobrança"
: c.valorDaFonte === "asaas" ? "a assinatura no Asaas" : "a tabela de preços (Asaas não respondeu)")
+ item("Situação no Asaas", assinaturaNoAsaas(c.assinaturaNoAsaas, c))
+ item("Contratado em", dataHora(c.contratadoEm)) + item("Cliente há", c.diasDeCliente === null || c.diasDeCliente === undefined ? "—" : esc(c.diasDeCliente) + " dia(s)")
+ item("Assinatura no Asaas", txt(c.assinatura)) + item("Cliente no Asaas", txt(c.clienteNoProvedor))
+ "</dl></section>"
+ '<section><h3>Dinheiro</h3><dl>'
+ (f.disponivel
+ (c.demonstracao
? item("Cobrança", "nenhuma — tenant de demonstração")
: f.disponivel
? item("Total pago", reais(f.totalPago)) + item("Líquido (após taxas)", reais(f.totalLiquido))
+ item("Taxas pagas", reais(f.taxas))
+ item("Último pagamento", f.ultimoPagamento ? data(f.ultimoPagamento.data) + " · " + reais(f.ultimoPagamento.valor) + " · " + txt(f.ultimoPagamento.forma) : "—")
+35 -17
View File
@@ -1801,7 +1801,7 @@ data:
<footer class="direitos">&copy; 2026 Athletic Map. Todos os direitos reservados.</footer>
<script src="/publico/minha-conta.js?v=2.88"></script>
<script src="/publico/minha-conta.js?v=2.89"></script>
</body>
</html>
@@ -1988,14 +1988,18 @@ data:
return n ? n.charAt(0).toUpperCase() + n.slice(1) : "—";
}
/* Tenant de DEMONSTRACAO do dono: o servidor marca (`demonstracao: true`). O
cartao diz isso ao lado da situacao, e nao ganha "Trocar de plano" nem
"Modulos avulsos" — nao ha cobranca, e o servidor recusaria de qualquer jeito. */
function cartao(p) {
var s = SITUACAO[p.situacao] || ["neutro", String(p.situacao || "").toLowerCase()];
var podeEntrar = p.endereco && p.situacao === "ATIVA";
return '<article class="produto ' + classeDoPlano(p.plano) + '"'
return '<article class="produto ' + classeDoPlano(p.plano) + (p.demonstracao ? " demonstracao" : "") + '"'
+ (p.tenant ? ' data-tenant="' + escapar(p.tenant) + '"' : "") + ">"
+ '<span class="faixa-plano">Plano ' + escapar(nomeDoPlano(p.plano)) + "</span>"
+ "<h2>" + escapar(p.escolinha || "Sua escolinha") + "</h2>"
+ '<span class="selo ' + s[0] + '">' + s[1] + "</span>"
+ (p.demonstracao ? '<span class="selo neutro">demonstra&ccedil;&atilde;o &mdash; sem cobran&ccedil;a</span>' : "")
+ (podeEntrar
? '<a class="btn" href="' + escapar(p.endereco) + '">Entrar &rarr;</a>'
: '<p class="ajuda">' + (p.situacao === "PREPARANDO"
@@ -2017,7 +2021,9 @@ data:
produtos.innerHTML = (lista || []).map(cartao).join("");
nenhum.classList.toggle("oculto", (lista || []).length > 0);
mostrar(conteudo);
(lista || []).forEach(function (p) { if (p.tenant && p.situacao === "ATIVA") acrescentarBotaoDePlano(p.tenant); });
(lista || []).forEach(function (p) {
if (p.tenant && p.situacao === "ATIVA" && !p.demonstracao) acrescentarBotaoDePlano(p.tenant);
});
return Promise.all([carregarCobranca(), carregarTermo(), carregarFaturas(), carregarVisao(),
carregarTermosDeUso()]);
});
@@ -3171,7 +3177,7 @@ data:
<option value="NASCENDO">Nascendo</option>
</select>
<label class="filtro"><input type="checkbox" id="soAtencao"> só com alerta</label>
<label class="filtro"><input type="checkbox" id="semTeste"> esconder testes</label>
<label class="filtro"><input type="checkbox" id="semTeste"> esconder testes e demonstrações</label>
</div>
<div class="tabela-rolagem">
<table class="tabela clientes">
@@ -3334,7 +3340,7 @@ data:
</main>
<script src="/publico/painel.js?v=2.86"></script>
<script src="/publico/painel.js?v=2.87"></script>
</body>
</html>
@@ -3630,9 +3636,13 @@ data:
bloco("Recebido desde o início", reaisCurto(i.recebidoTotal),
i.clientesSemDadoDoAsaas > 0 ? i.clientesSemDadoDoAsaas + " sem resposta do Asaas" : "extrato do Asaas", "")
].join("");
// Teste e demonstracao aparecem na lista, mas nao nos numeros — e a tela diz.
var foraDosNumeros = [];
if (i.contasDeTeste > 0) foraDosNumeros.push(i.contasDeTeste + " de teste");
if (i.demonstracoes > 0) foraDosNumeros.push(i.demonstracoes + " de demonstração");
$("kpiClientes").innerHTML = [
bloco("Clientes ativos", esc(i.clientesAtivos),
i.contasDeTeste > 0 ? "+ " + i.contasDeTeste + " de teste (fora dos números)" : "", "ok"),
foraDosNumeros.length ? "+ " + foraDosNumeros.join(", ") + " (fora dos números)" : "", "ok"),
bloco("Novos no mês", esc(i.novosNoMes), comparacao(i.novosNoMes, i.novosMesAnterior), ""),
bloco("Leads no mês", esc(i.leadsNoMes), comparacao(i.leadsNoMes, i.leadsMesAnterior), ""),
bloco("Conversão", pct(i.conversao), "de lead para cliente pagante", ""),
@@ -3671,7 +3681,7 @@ data:
if (plano && c.plano !== plano) return false;
if (estado && (c.estado || "NASCENDO") !== estado) return false;
if (soAtencao && !(c.alertas || []).length) return false;
if (semTeste && c.teste) return false;
if (semTeste && (c.teste || c.demonstracao)) return false;
if (busca) {
var alvo = [c.cliente, c.escolinha, c.email, c.cidade, c.tenant, c.whatsapp, c.documento]
.join(" ").toLowerCase();
@@ -3701,7 +3711,9 @@ data:
}
var SITUACAO_ASAAS = { ACTIVE: "ativa", INACTIVE: "encerrada", EXPIRED: "expirada" };
function assinaturaNoAsaas(a) {
/* A demonstracao nao existe no Asaas DE PROPOSITO: nao e "nao existe" em vermelho. */
function assinaturaNoAsaas(a, c) {
if (c && c.demonstracao) return "demonstração — sem cobrança";
if (!a || !a.disponivel) return "indisponível agora";
if (!a.existe) return '<b class="vermelho">não existe</b>';
var s = SITUACAO_ASAAS[a.situacao] || txt(a.situacao);
@@ -3738,10 +3750,11 @@ data:
var gravidade = (c.alertas || []).reduce(function (g, a) {
return a.gravidade === "critico" ? "critico" : (g === "critico" ? g : (a.gravidade === "alerta" ? "alerta" : g));
}, "");
return '<tr class="clicavel' + (gravidade ? " linha-" + gravidade : "") + (c.teste ? " teste" : "")
return '<tr class="clicavel' + (gravidade ? " linha-" + gravidade : "") + (c.teste || c.demonstracao ? " teste" : "")
+ (!c.tenant ? " destaque" : "") + '" data-assinatura="' + esc(c.assinatura) + '" tabindex="0">'
+ "<td><b>" + txt(c.cliente) + "</b>"
+ (c.teste ? ' <span class="selo neutro">teste</span>' : "")
+ (c.demonstracao ? ' <span class="selo neutro">demonstração</span>' : "")
+ '<span class="sub">' + (c.tenant
? '<a href="' + esc(c.endereco) + '" target="_blank" rel="noopener noreferrer">' + esc(c.tenant) + "</a>"
: "sem tenant")
@@ -3750,9 +3763,9 @@ data:
+ "<td>" + etiquetaPlano(c) + "</td>"
+ "<td>" + selo(c.estado, c.tenant) + '<span class="sub">' + (c.diasDeCliente !== null && c.diasDeCliente !== undefined
? "cliente há " + esc(c.diasDeCliente) + " dia(s)" : "") + "</span></td>"
+ '<td class="num">' + reais(c.valorMensal) + diferencaDeTabela(c) + "</td>"
+ '<td class="num">' + (f.disponivel ? reais(f.totalPago) + '<span class="sub">' + esc(f.cobrancasPagas) + " cobrança(s)</span>" : "—") + "</td>"
+ "<td>" + proximaCobranca(f) + "</td>"
+ '<td class="num">' + (c.demonstracao ? '<span class="ajuda">sem cobrança</span>' : reais(c.valorMensal) + diferencaDeTabela(c)) + "</td>"
+ '<td class="num">' + (c.demonstracao ? "—" : f.disponivel ? reais(f.totalPago) + '<span class="sub">' + esc(f.cobrancasPagas) + " cobrança(s)</span>" : "—") + "</td>"
+ "<td>" + (c.demonstracao ? '<span class="ajuda">—</span>' : proximaCobranca(f)) + "</td>"
+ "<td>" + usoCurto(c.uso, c.usoDeDentro) + "</td>"
+ "<td>" + seloSubconta(c.subconta) + "</td>"
+ "</tr>";
@@ -3778,7 +3791,9 @@ data:
+ esc(a.titulo) + '</b><span class="sub">' + esc(a.detalhe) + "</span></div></li>";
}).join("");
var extrato = f.disponivel
var extrato = c.demonstracao
? '<p class="ajuda">Tenant de demonstração: não há assinatura nem cobrança no Asaas.</p>'
: f.disponivel
? ((f.cobrancas || []).length
? '<table class="tabela"><thead><tr><th>Vencimento</th><th>Pago em</th><th>Forma</th><th class="num">Valor</th><th class="num">Líquido</th><th>Situação</th><th></th></tr></thead><tbody>'
+ f.cobrancas.map(function (cb) {
@@ -3799,7 +3814,7 @@ data:
return '<header class="ficha-topo ' + classePlano(c.plano) + '">'
+ '<span class="etiqueta ' + classePlano(c.plano) + '">Plano ' + esc(nomePlano(c.plano))
+ (c.ciclo === "ANUAL" ? " · anual" : " · mensal") + "</span>"
+ '<h2 id="fichaTitulo">' + txt(c.cliente) + "</h2>"
+ '<h2 id="fichaTitulo">' + txt(c.cliente) + (c.demonstracao ? ' <span class="selo neutro">demonstração</span>' : "") + "</h2>"
+ '<p class="sub">' + (c.escolinha && c.escolinha !== c.cliente ? esc(c.escolinha) + " · " : "")
+ selo(c.estado, c.tenant) + (c.estadoDesde ? " desde " + dataHora(c.estadoDesde) : "") + "</p>"
+ '<div class="atalhos">'
@@ -3821,14 +3836,17 @@ data:
+ '<section><h3>Assinatura</h3><dl>'
+ item("Plano", esc(nomePlano(c.plano)) + " " + (c.ciclo === "ANUAL" ? "anual" : "mensal"))
+ item("Valor do ciclo", reais(c.valorDoCiclo)) + item("Vale por mês", reais(c.valorMensal) + diferencaDeTabela(c))
+ item("De onde vem o valor", c.valorDaFonte === "asaas" ? "a assinatura no Asaas" : "a tabela de preços (Asaas não respondeu)")
+ item("Situação no Asaas", assinaturaNoAsaas(c.assinaturaNoAsaas))
+ item("De onde vem o valor", c.demonstracao ? "demonstração — sem cobrança"
: c.valorDaFonte === "asaas" ? "a assinatura no Asaas" : "a tabela de preços (Asaas não respondeu)")
+ item("Situação no Asaas", assinaturaNoAsaas(c.assinaturaNoAsaas, c))
+ item("Contratado em", dataHora(c.contratadoEm)) + item("Cliente há", c.diasDeCliente === null || c.diasDeCliente === undefined ? "—" : esc(c.diasDeCliente) + " dia(s)")
+ item("Assinatura no Asaas", txt(c.assinatura)) + item("Cliente no Asaas", txt(c.clienteNoProvedor))
+ "</dl></section>"
+ '<section><h3>Dinheiro</h3><dl>'
+ (f.disponivel
+ (c.demonstracao
? item("Cobrança", "nenhuma — tenant de demonstração")
: f.disponivel
? item("Total pago", reais(f.totalPago)) + item("Líquido (após taxas)", reais(f.totalLiquido))
+ item("Taxas pagas", reais(f.taxas))
+ item("Último pagamento", f.ultimoPagamento ? data(f.ultimoPagamento.data) + " · " + reais(f.ultimoPagamento.valor) + " · " + txt(f.ultimoPagamento.forma) : "—")