feat: dashboard cliente 360 — visao completa por cliente com KPIs, timeline, fluxos e transacoes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
51
server.js
51
server.js
@@ -11,12 +11,13 @@ 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 } = require('./src/queries');
|
||||
const { fetchTransacoes, fetchAllTransacoes, serialize, fetchDailyStats, fetchKPIs, fetchTrend30Days, fetchTopAgentes, fetchTrendByPeriod, fetchKPIsByPeriod, fetchBIData, fetchRevenueAnalytics, fetchClientList, fetchClientProfile, fetchClientData } = require('./src/queries');
|
||||
const { buildHTML } = require('./src/dashboard');
|
||||
const { buildAdminHTML } = require('./src/admin-panel');
|
||||
const { buildAdminHomeHTML } = require('./src/admin-home');
|
||||
const { buildAdminDashboardHTML } = require('./src/admin-dashboard');
|
||||
const { buildAdminBIHTML } = require('./src/admin-bi');
|
||||
const { buildAdminClienteHTML } = require('./src/admin-cliente');
|
||||
const bcrypt = require('bcrypt');
|
||||
const db = require('./src/db-local');
|
||||
const cache = require('./src/cache');
|
||||
@@ -369,6 +370,54 @@ app.get('/admin/api/bi/revenue', requireRole('admin'), async (req, res) => {
|
||||
}
|
||||
});
|
||||
|
||||
// --- Admin Cliente Dashboard (admin only) ---
|
||||
app.get('/admin/cliente', requireRole('admin'), (req, res) => {
|
||||
try {
|
||||
res.set('Cache-Control', 'no-store, no-cache, must-revalidate');
|
||||
res.set('Pragma', 'no-cache');
|
||||
const html = buildAdminClienteHTML(req.session.user);
|
||||
res.send(html);
|
||||
} catch (err) {
|
||||
console.error('Admin Cliente error:', err);
|
||||
res.status(500).send('Erro ao carregar pagina de cliente: ' + err.message);
|
||||
}
|
||||
});
|
||||
|
||||
app.get('/admin/api/clientes', requireRole('admin'), async (req, res) => {
|
||||
try {
|
||||
const data = await cache.getOrFetch('client-list', fetchClientList, 15 * 60 * 1000);
|
||||
res.json(data);
|
||||
} catch (err) {
|
||||
console.error('Client list API error:', err);
|
||||
res.status(500).json({ error: err.message });
|
||||
}
|
||||
});
|
||||
|
||||
app.get('/admin/api/cliente/:id/profile', requireRole('admin'), async (req, res) => {
|
||||
try {
|
||||
const clienteId = parseInt(req.params.id);
|
||||
if (!clienteId) return res.status(400).json({ error: 'Invalid client ID' });
|
||||
const data = await fetchClientProfile(clienteId);
|
||||
res.json(data);
|
||||
} catch (err) {
|
||||
console.error('Client profile API error:', err);
|
||||
res.status(500).json({ error: err.message });
|
||||
}
|
||||
});
|
||||
|
||||
app.get('/admin/api/cliente/:id/data', requireRole('admin'), async (req, res) => {
|
||||
try {
|
||||
const clienteId = parseInt(req.params.id);
|
||||
const { start, end } = req.query;
|
||||
if (!clienteId || !start || !end) return res.status(400).json({ error: 'client ID, start and end required' });
|
||||
const data = await fetchClientData(clienteId, start, end);
|
||||
res.json(data);
|
||||
} catch (err) {
|
||||
console.error('Client data 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;
|
||||
|
||||
Reference in New Issue
Block a user