Files
seguidorDeLotes/nuxt4/server/api/externos/stats.get.ts
josedario87 ce8bad68d5
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 2m46s
Agregar sistema de vinculaciones con registros externos de Metabase
- Nuevo schema BD para vinculaciones_externas con constraint único por período
- Cliente Metabase para consultar Ingresos, Carretas, Salidas y Rechazos
- Endpoints API para registros externos (/api/externos/*) y vinculaciones (/api/vinculaciones/*)
- Composable useRegistrosExternos con lógica de vinculación individual y masiva
- Componentes: TablaRegistros, ModalAsignar, ProgressDashboard
- Tab "Externos" en app.vue con sub-tabs y dashboard de progreso
- LotesCard.vue ahora muestra registros vinculados al lote
2025-11-29 15:25:26 -06:00

82 lines
2.8 KiB
TypeScript

/**
* 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',
})
}
})