Files
HoruxDespachosNuevo/apps/api/src/controllers/dashboard.controller.ts

109 lines
4.1 KiB
TypeScript

import type { Request, Response, NextFunction } from 'express';
import * as dashboardService from '../services/dashboard.service.js';
import { generarAlertasAutomaticas } from '../services/alertas-auto.service.js';
import { getAlertasManualesPendientes } from '../services/alertas-manuales.service.js';
import { AppError } from '../middlewares/error.middleware.js';
function getDefaultRange() {
const now = new Date();
const y = now.getFullYear();
const m = now.getMonth() + 1;
const lastDay = new Date(y, m, 0).getDate();
return {
fechaInicio: `${y}-${String(m).padStart(2, '0')}-01`,
fechaFin: `${y}-${String(m).padStart(2, '0')}-${String(lastDay).padStart(2, '0')}`,
año: y,
mes: m,
};
}
function parseConciliacion(req: Request): boolean {
return req.query.conciliacion === 'true' || req.query.conciliacion === '1';
}
export async function getKpis(req: Request, res: Response, next: NextFunction) {
try {
if (!req.tenantPool) {
return next(new AppError(400, 'Tenant no configurado'));
}
const defaults = getDefaultRange();
const fechaInicio = (req.query.fechaInicio as string) || defaults.fechaInicio;
const fechaFin = (req.query.fechaFin as string) || defaults.fechaFin;
const conciliacion = parseConciliacion(req);
const contribuyenteId = (req.query.contribuyenteId as string) || null;
const tenantId = req.viewingTenantId || req.user!.tenantId;
const kpis = await dashboardService.getKpis(req.tenantPool, fechaInicio, fechaFin, tenantId, conciliacion, contribuyenteId);
res.json(kpis);
} catch (error) {
next(error);
}
}
export async function getIngresosEgresos(req: Request, res: Response, next: NextFunction) {
try {
if (!req.tenantPool) {
return next(new AppError(400, 'Tenant no configurado'));
}
const año = parseInt(req.query.año as string) || new Date().getFullYear();
const conciliacion = parseConciliacion(req);
const contribuyenteId = (req.query.contribuyenteId as string) || null;
const tenantId = req.viewingTenantId || req.user!.tenantId;
const data = await dashboardService.getIngresosEgresos(req.tenantPool, año, tenantId, conciliacion, contribuyenteId);
res.json(data);
} catch (error) {
next(error);
}
}
export async function getRegimenesDelPeriodo(req: Request, res: Response, next: NextFunction) {
try {
if (!req.tenantPool) {
return next(new AppError(400, 'Tenant no configurado'));
}
const defaults = getDefaultRange();
const fechaInicio = (req.query.fechaInicio as string) || defaults.fechaInicio;
const fechaFin = (req.query.fechaFin as string) || defaults.fechaFin;
const conciliacion = parseConciliacion(req);
const contribuyenteId = (req.query.contribuyenteId as string) || null;
const tenantId = req.viewingTenantId || req.user?.tenantId;
const regimenes = await dashboardService.getRegimenesDelPeriodo(req.tenantPool, fechaInicio, fechaFin, conciliacion, contribuyenteId, tenantId);
res.json(regimenes);
} catch (error) {
next(error);
}
}
export async function getAlertas(req: Request, res: Response, next: NextFunction) {
try {
if (!req.tenantPool) {
return next(new AppError(400, 'Tenant no configurado'));
}
const limit = parseInt(req.query.limit as string) || 5;
const tenantId = req.viewingTenantId || req.user!.tenantId;
const contribuyenteId = (req.query.contribuyenteId as string) || null;
// Combinar alertas persistidas (manuales, filtered by role) + automáticas (calculadas)
const [manuales, automaticas] = await Promise.all([
getAlertasManualesPendientes(req.tenantPool, contribuyenteId, req.user!.userId, req.user!.role),
generarAlertasAutomaticas(req.tenantPool, tenantId, contribuyenteId),
]);
// Unir, ordenar por prioridad, y limitar
const prioridadOrden: Record<string, number> = { alta: 1, media: 2, baja: 3 };
const alertas = [...automaticas, ...manuales]
.sort((a, b) => (prioridadOrden[a.prioridad] || 3) - (prioridadOrden[b.prioridad] || 3))
.slice(0, limit);
res.json(alertas);
} catch (error) {
next(error);
}
}