feat: BI estrategico — cohort retention, revenue expansion, cross-sell, maturity + receita em USD

- Cohort retention heatmap com matriz de retencao por mes de aquisicao
- Revenue expansion/contraction waterfall (new/expansion/stable/contraction/churned)
- Cross-sell analysis (CambioPay only vs CambioCheckout only vs Both)
- Client maturity segmentation (new/growing/mature/declining)
- Nova query fetchBIStrategic + endpoint /admin/api/bi/strategic
- Todas receitas de spread convertidas de BRL para USD em todas as queries
- Labels e formatacao atualizados para USD em admin-bi e admin-cliente

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
root
2026-02-16 15:36:39 -05:00
parent 4595be0b07
commit 175e21b2d4
4 changed files with 1987 additions and 1176 deletions

View File

@@ -11,7 +11,7 @@ const express = require('express');
const session = require('express-session');
const path = require('path');
const { authenticate, requireAuth, requireRole, createAgente, createUser } = require('./src/auth');
const { fetchTransacoes, fetchAllTransacoes, serialize, fetchDailyStats, fetchKPIs, fetchTrend30Days, fetchTopAgentes, fetchTrendByPeriod, fetchKPIsByPeriod, fetchBIData, fetchRevenueAnalytics, fetchClientList, fetchClientProfile, fetchClientData } = require('./src/queries');
const { fetchTransacoes, fetchAllTransacoes, serialize, fetchDailyStats, fetchKPIs, fetchTrend30Days, fetchTopAgentes, fetchTrendByPeriod, fetchKPIsByPeriod, fetchBIData, fetchRevenueAnalytics, fetchBIStrategic, fetchClientList, fetchClientProfile, fetchClientData } = require('./src/queries');
const { buildHTML } = require('./src/dashboard');
const { buildAdminHTML } = require('./src/admin-panel');
const { buildAdminHomeHTML } = require('./src/admin-home');
@@ -370,6 +370,18 @@ app.get('/admin/api/bi/revenue', requireRole('admin'), async (req, res) => {
}
});
app.get('/admin/api/bi/strategic', requireRole('admin'), async (req, res) => {
try {
const { start, end } = req.query;
if (!start || !end) return res.status(400).json({ error: 'start and end required' });
const data = await fetchBIStrategic(start, end);
res.json(data);
} catch (err) {
console.error('Strategic BI API error:', err);
res.status(500).json({ error: err.message });
}
});
// --- Admin Cliente Dashboard (admin only) ---
app.get('/admin/cliente', requireRole('admin'), (req, res) => {
try {