// Tela: Minha Assinatura — o cliente vê o plano, status e faturas, e paga (recorrente) const asHeaders = () => { const t = localStorage.getItem('ezza_token'); return { 'Content-Type':'application/json', ...(t?{'Authorization':`Bearer ${t}`}:{}) }; }; const asMoney = (v) => 'R$ ' + (Number(v)||0).toLocaleString('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); const asData = (d) => { if (!d) return '—'; const [y,m,dd] = String(d).slice(0,10).split('-'); return `${dd}/${m}/${y}`; }; // Rótulo + cor de cada status (assinatura e fatura) const AS_STATUS = { ativa: { label: 'Ativa', cls: 'mint', dot: true }, trial: { label: 'Em teste', cls: 'lav', dot: true }, pendente: { label: 'Aguardando pagamento', cls: 'yellow' }, inadimplente: { label: 'Pagamento atrasado', cls: 'pink' }, cancelada: { label: 'Cancelada', cls: 'off' }, }; const FAT_STATUS = { paga: { label: 'Paga', cls: 'mint' }, pendente: { label: 'Pendente', cls: 'yellow' }, atrasada: { label: 'Atrasada', cls: 'pink' }, }; function Assinatura({ onBack }) { const [dados, setDados] = React.useState(null); // { assinatura, faturas } const [carregando, setCarregando] = React.useState(true); const toast = useToast(); React.useEffect(() => { fetch('/api/assinatura', { headers: asHeaders() }) .then(r => r.json()) .then(d => { if (d.ok) setDados(d); }) .catch(() => {}) .finally(() => setCarregando(false)); }, []); const a = dados?.assinatura || {}; const faturas = dados?.faturas || []; const st = AS_STATUS[a.status] || null; const temPlano = !!a.plano; const valorCiclo = a.ciclo === 'anual' ? (a.preco_mensal * 12) : a.preco_mensal; // Próxima fatura em aberto (pendente/atrasada) — pra destacar o botão de pagar const faturaAberta = faturas.find(f => f.status !== 'paga'); const gerenciar = () => { if (a.link) window.open(a.link, '_blank'); else toast('O link de pagamento ainda não foi configurado. Fale com o suporte.', { kind: 'err', duration: 4000 }); }; return ( <> Minha assinatura} subtitle="Plano, cobranças e faturas" back onBack={onBack} /> {carregando &&
Carregando…
} {!carregando && !temPlano && (
{ICN.briefcase}
Nenhum plano ativo ainda

Sua conta está em cortesia. Para ativar todos os recursos e a Sofia respondendo 24/7, fale com o nosso time.

)} {!carregando && temPlano && ( <> {/* ── Cartão do plano ── */}
Plano {a.plano_label} {st && {st.dot && }{st.label}}
{asMoney(valorCiclo)} / {a.ciclo === 'anual' ? 'ano' : 'mês'}
{a.metodo && {a.metodo === 'cartao' ? '💳 Cartão de crédito' : a.metodo === 'pix' ? 'Pix recorrente' : 'Boleto'}} {a.dia && · Cobrança todo dia {a.dia}} {a.plano_desde && · Cliente desde {asData(a.plano_desde)}}
{a.titular &&
Titular: {a.titular}
}
{faturaAberta ? : }
Pagamento seguro · seus dados de cartão ficam no provedor, nunca no CRM
{/* ── Faturas ── */}
Histórico de faturas
{faturas.length === 0 &&
Nenhuma fatura registrada ainda. A primeira aparece na próxima cobrança.
} {faturas.length > 0 && ( {faturas.map(f => { const fs = FAT_STATUS[f.status] || FAT_STATUS.pendente; return ( ); })}
CompetênciaVencimentoValorStatus
{f.competencia || '—'} {asData(f.vencimento)} {asMoney(f.valor)} {fs.label} {f.status !== 'paga' && f.link_pagamento && } {f.status === 'paga' && Pago em {asData(f.pago_em)}}
)}
{/* ── Ajuda ── */}
Precisa mudar de plano, trocar o cartão ou emitir nota fiscal? {' '} { e.preventDefault(); const msg = encodeURIComponent('Olá! Preciso de ajuda com minha assinatura no Ezza CRM.'); window.open(`https://wa.me/${window.EZZA_SUPORTE_WA || '5585991598284'}?text=${msg}`, '_blank'); }}>Fale com o suporte.
)} ); } window.Assinatura = Assinatura;