feat: revenue analytics (P&L real) no BI admin

Seção Revenue Analytics com cálculo real de receita por produto:
- Query completa com fees, pfee, bonus, taxa_cr por provider
- Granulação dinâmica (dia/mês/ano) com filtro de período
- KPIs: receita total, BR→US, US→BR, receita/operação
- Stacked bar por produto + donut composição + tabela detalhada
- Produtos: Checkout, CambioTransfer, balance, swift, etc.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
root
2026-02-14 12:49:03 -05:00
parent cadc4cd01e
commit 5ecf91a024
3 changed files with 449 additions and 7 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 } = require('./src/queries');
const { fetchTransacoes, fetchAllTransacoes, serialize, fetchDailyStats, fetchKPIs, fetchTrend30Days, fetchTopAgentes, fetchTrendByPeriod, fetchKPIsByPeriod, fetchBIData, fetchRevenueAnalytics } = require('./src/queries');
const { buildHTML } = require('./src/dashboard');
const { buildAdminHTML } = require('./src/admin-panel');
const { buildAdminHomeHTML } = require('./src/admin-home');
@@ -355,6 +355,18 @@ app.get('/admin/api/bi', requireRole('admin'), async (req, res) => {
}
});
app.get('/admin/api/bi/revenue', requireRole('admin'), async (req, res) => {
try {
const { start, end, granularity } = req.query;
if (!start || !end) return res.status(400).json({ error: 'start and end required' });
const data = await fetchRevenueAnalytics(start, end, granularity || 'dia');
res.json(data);
} catch (err) {
console.error('Revenue API error:', err);
res.status(500).json({ error: err.message });
}
});
// Create user (admin only)
app.post('/admin/agentes', requireRole('admin'), async (req, res) => {
const { nome, email, agente_id, senha, role } = req.body;