// Módulo RELATÓRIOS — Vendas, RFM (clientes), Lives
const RelatoriosPage = () => {
const [tab, setTab] = React.useState("vendas");
return (
Inteligência de negócio
Relatórios
Vendas · produtos · clientes · segmentação RFM · comparativo de lives.
{tab === "vendas" &&
}
{tab === "rfm" &&
}
{tab === "lives" &&
}
{tab === "produtos" &&
}
{(tab === "geografico" || tab === "trocas") &&
}
);
};
const RelVendas = () => (
Evolução diária · maio 26 vs. abril 26
Vendas por responsável
comissões aplicadas
| Responsável | Pedidos | Faturamento | Ticket médio | Meta | Atingido | Comissão |
| Letícia BorgesLive | 487 | {brl(74820.30)} | {brl(153.63)} | {brlNoCents(60000)} | 124% | {brl(2244.60)} |
| Bruna CarvalhoPDV | 214 | {brl(31425.80)} | {brl(146.85)} | {brlNoCents(30000)} | 104% | {brl(942.77)} |
| Janaína FerreiraSite/WPP | 191 | {brl(36594.20)} | {brl(191.59)} | {brlNoCents(45000)} | 81% | {brl(731.88)} |
);
const RelRfm = () => (
Segmentação RFM · 1.304 clientes
{RFM_SEGMENTOS.map((s, i) => (
{s.nome.toUpperCase()}
{numFmt(s.clientes)}
{s.desc}
{brlNoCents(s.valor)} · LTV
))}
| Cliente | Pedidos | LTV | Última |
{CLIENTES.filter(c => c.rfm === "Champions").concat(CLIENTES.slice(0,4)).slice(0,7).map((c, i) => (
| {c.nome} |
{c.pedidos} |
{brl(c.totalGasto)} |
{c.ultimaCompra} |
))}
Em risco · 204 clientes
Clientes leais que não compram há 60-90 dias. Receita potencial perdida: {brl(64280)}
Ação sugerida
💡 Campanha "Voltamos pra você": cupom 15% + frete grátis acima R$ 200. ROI estimado: 8.2×
);
const RelLives = () => (
Comparativo · 5 últimas lives
{LIVES_HISTORICO.slice().reverse().map((l, i) => {
const max = Math.max(...LIVES_HISTORICO.map(x => x.faturamento));
const h = (l.faturamento / max) * 100;
const isMax = l.faturamento === max;
return (
{brlNoCents(l.faturamento)}
{isMax && melhor}
#{43 + i}
{l.data}
);
})}
Histórico de lives
| Live | Data | Pedidos | Clientes únicos | Faturamento | Ticket médio | % pagos | |
{LIVES_HISTORICO.map((l, i) => (
| {l.nome} |
{l.data} |
{l.pedidos} |
{l.clientes} |
{brl(l.faturamento)} |
{brl(l.ticket)} |
= 85 ? "green" : l.pagos >= 80 ? "cyan" : "amber"} dot>{l.pagos}% |
⋯ |
))}
);
const RelProdutos = () => (
Top 10 produtos · período
| # | Produto | Marca | Categoria | Qtd | Receita | Margem |
{PRODUTOS.slice().sort((a,b) => b.vendas30d - a.vendas30d).map((p, i) => (
| {i+1} |
{p.foto} |
{p.marca} |
{p.categoria} |
{p.vendas30d} |
{brl(p.preco * p.vendas30d * 0.7)} |
{((p.preco / p.custo - 1) * 60).toFixed(0)}% |
))}
);
Object.assign(window, { RelatoriosPage });