diff --git a/apps/api/src/services/dashboard.service.ts b/apps/api/src/services/dashboard.service.ts index 7b1476f..e4934d8 100644 --- a/apps/api/src/services/dashboard.service.ts +++ b/apps/api/src/services/dashboard.service.ts @@ -1107,10 +1107,21 @@ export async function getKpis( const ctx = await resolveContribuyenteContext(pool, tenantId, contribuyenteId); const esEmisor = ctx.esEmisor; const esReceptor = ctx.esReceptor; - const ingresosData = await calcularIngresosPorRegimen(pool, tenantId, fechaInicio, fechaFin, undefined, undefined, conciliacion, contribuyenteId); - const egresosData = await calcularEgresosPorRegimen(pool, tenantId, fechaInicio, fechaFin, undefined, undefined, conciliacion, contribuyenteId); - const adquisicionData = await calcularAdquisicionesMercancias(pool, tenantId, fechaInicio, fechaFin, conciliacion, contribuyenteId); - const ivaData = await calcularIvaBalancePorRegimen(pool, tenantId, fechaInicio, fechaFin, undefined, undefined, conciliacion, contribuyenteId); + const [ + ingresosData, + egresosData, + adquisicionData, + ivaData, + ncsEmitidasData, + ncsRecibidasData, + ] = await Promise.all([ + calcularIngresosPorRegimen(pool, tenantId, fechaInicio, fechaFin, undefined, undefined, conciliacion, contribuyenteId), + calcularEgresosPorRegimen(pool, tenantId, fechaInicio, fechaFin, undefined, undefined, conciliacion, contribuyenteId), + calcularAdquisicionesMercancias(pool, tenantId, fechaInicio, fechaFin, conciliacion, contribuyenteId), + calcularIvaBalancePorRegimen(pool, tenantId, fechaInicio, fechaFin, undefined, undefined, conciliacion, contribuyenteId), + calcularNcsEmitidasPorRegimen(pool, tenantId, fechaInicio, fechaFin, undefined, undefined, conciliacion, contribuyenteId), + calcularNcsRecibidasPorRegimen(pool, tenantId, fechaInicio, fechaFin, undefined, undefined, conciliacion, contribuyenteId), + ]); // IVA a favor año actual: desde enero del año en curso const ivaAFavorAcumulado = await calcularIvaAFavorAcumulado(pool, tenantId, fechaFin, undefined, conciliacion, contribuyenteId); @@ -1163,6 +1174,10 @@ export async function getKpis( cfdisEmitidosPorRegimen: emitidosPorRegimen, cfdisRecibidos: recibidosPorRegimen.reduce((s: number, r: any) => s + r.total, 0), cfdisRecibidosPorRegimen: recibidosPorRegimen, + ncsEmitidas: ncsEmitidasData.total, + ncsEmitidasPorRegimen: ncsEmitidasData.porRegimen, + ncsRecibidas: ncsRecibidasData.total, + ncsRecibidasPorRegimen: ncsRecibidasData.porRegimen, }; } diff --git a/apps/web/app/(dashboard)/dashboard/page.tsx b/apps/web/app/(dashboard)/dashboard/page.tsx index 3fc3cb6..c18d1d5 100644 --- a/apps/web/app/(dashboard)/dashboard/page.tsx +++ b/apps/web/app/(dashboard)/dashboard/page.tsx @@ -19,6 +19,8 @@ import { AlertTriangle, ShoppingCart, CheckSquare, + FileMinus, + FilePlus, } from 'lucide-react'; import { cn } from '@horux/shared-ui'; import { FiscalDisclaimer } from '@/components/fiscal-disclaimer'; @@ -118,6 +120,15 @@ export default function DashboardPage() { ? kpis?.ivaBalancePorRegimen?.find(r => r.regimenClave === regimenSeleccionado)?.monto || 0 : kpis?.ivaBalance || 0; + // Notas de crédito + const ncsEmitidasDisplay = regimenSeleccionado + ? kpis?.ncsEmitidasPorRegimen?.find(r => r.regimenClave === regimenSeleccionado)?.monto || 0 + : kpis?.ncsEmitidas || 0; + + const ncsRecibidasDisplay = regimenSeleccionado + ? kpis?.ncsRecibidasPorRegimen?.find(r => r.regimenClave === regimenSeleccionado)?.monto || 0 + : kpis?.ncsRecibidas || 0; + const ivaAnterior = regimenSeleccionado ? kpisAnterior?.ivaBalancePorRegimen?.find(r => r.regimenClave === regimenSeleccionado)?.monto || 0 : kpisAnterior?.ivaBalance || 0; @@ -203,7 +214,7 @@ export default function DashboardPage() { {/* KPIs */} -
+
+ } + trend="neutral" + trendValue="Notas de crédito emitidas" + /> + } + trend="neutral" + trendValue="Notas de crédito recibidas" + />
{/* Desglose por régimen */} {!regimenSeleccionado && kpis && ( - (kpis.ingresosPorRegimen.length > 1 || kpis.egresosPorRegimen.length > 1 || kpis.ivaBalancePorRegimen.length > 1) && ( + (kpis.ingresosPorRegimen.length > 1 || kpis.egresosPorRegimen.length > 1 || kpis.ivaBalancePorRegimen.length > 1 || kpis.ncsEmitidasPorRegimen.length > 1 || kpis.ncsRecibidasPorRegimen.length > 1) && (
{kpis.ingresosPorRegimen.length > 1 && ( @@ -316,6 +341,46 @@ export default function DashboardPage() { )} + {kpis.ncsEmitidasPorRegimen.length > 1 && ( + + + NCs Emitidas por Regimen + + +
+ {kpis.ncsEmitidasPorRegimen.map((r) => ( +
+
+ {r.regimenClave} + {r.regimenDescripcion} +
+ {formatCurrency(r.monto)} +
+ ))} +
+
+
+ )} + {kpis.ncsRecibidasPorRegimen.length > 1 && ( + + + NCs Recibidas por Regimen + + +
+ {kpis.ncsRecibidasPorRegimen.map((r) => ( +
+
+ {r.regimenClave} + {r.regimenDescripcion} +
+ {formatCurrency(r.monto)} +
+ ))} +
+
+
+ )}
))} diff --git a/packages/shared/src/types/dashboard.ts b/packages/shared/src/types/dashboard.ts index 691b187..f8f8657 100644 --- a/packages/shared/src/types/dashboard.ts +++ b/packages/shared/src/types/dashboard.ts @@ -33,6 +33,10 @@ export interface KpiData { cfdisEmitidosPorRegimen: { regimen: string; total: number }[]; cfdisRecibidos: number; cfdisRecibidosPorRegimen: { regimen: string; total: number }[]; + ncsEmitidas: number; + ncsEmitidasPorRegimen: IngresoRegimen[]; + ncsRecibidas: number; + ncsRecibidasPorRegimen: IngresoRegimen[]; } export interface IngresosEgresosData {