/** * GET /api/externos/stats * * Obtiene estadísticas de vinculación para el dashboard. * Combina datos de Metabase (totales) con nuestra BD local (vinculados). */ import { getConteoRegistros } from '../../utils/metabase' import { getEstadisticasVinculacion } from '../../utils/queries' export default defineEventHandler(async (event) => { try { const query = getQuery(event) const periodo = (query.periodo as string) || '25-26' // Obtener conteos totales desde Metabase const totales = await getConteoRegistros(periodo) // Obtener conteos de vinculados desde nuestra BD local const vinculados = await getEstadisticasVinculacion(periodo) // Calcular estadísticas completas const stats = { ingresos: { total: totales.ingresos, vinculados: vinculados.ingreso.vinculados, sinVincular: totales.ingresos - vinculados.ingreso.vinculados, porcentaje: totales.ingresos > 0 ? Math.round((vinculados.ingreso.vinculados / totales.ingresos) * 100) : 0, }, carretas: { total: totales.carretas, vinculados: vinculados.carreta.vinculados, sinVincular: totales.carretas - vinculados.carreta.vinculados, porcentaje: totales.carretas > 0 ? Math.round((vinculados.carreta.vinculados / totales.carretas) * 100) : 0, }, salidas: { total: totales.salidas, vinculados: vinculados.salida.vinculados, sinVincular: totales.salidas - vinculados.salida.vinculados, porcentaje: totales.salidas > 0 ? Math.round((vinculados.salida.vinculados / totales.salidas) * 100) : 0, }, rechazos: { total: totales.rechazos, vinculados: vinculados.rechazo.vinculados, sinVincular: totales.rechazos - vinculados.rechazo.vinculados, porcentaje: totales.rechazos > 0 ? Math.round((vinculados.rechazo.vinculados / totales.rechazos) * 100) : 0, }, resumen: { total: totales.ingresos + totales.carretas + totales.salidas + totales.rechazos, vinculados: vinculados.total_vinculados, sinVincular: (totales.ingresos + totales.carretas + totales.salidas + totales.rechazos) - vinculados.total_vinculados, porcentaje: 0, }, periodo, } // Calcular porcentaje general stats.resumen.porcentaje = stats.resumen.total > 0 ? Math.round((stats.resumen.vinculados / stats.resumen.total) * 100) : 0 return { success: true, data: stats, } } catch (error: any) { console.error('[API] Error obteniendo estadísticas:', error) throw createError({ statusCode: error.statusCode || 500, statusMessage: error.message || 'Error obteniendo estadísticas', }) } })