--- import AppLayout from '@/layouts/AppLayout.astro'; import Chart from '@/components/admin/estadisticas/Chart.tsx'; import { todayMX } from '@/lib/date'; import { getEstadisticas } from '@/lib/stats-cache'; // El middleware ya garantiza rol admin en /admin/*. const supabase = Astro.locals.supabase; const dia = todayMX(); // Cache 60s en RAM (getEstadisticas absorbe >90% de visitas repetidas). const { kpis: k, topMateriales, solicitudesPorDia, distribEstados } = await getEstadisticas(supabase, dia); // Debe coincidir con la ventana en stats-cache.ts (rango de las 3 gráficas). const DIAS = 30; const vencidosCount = k.nVencidos; const kpis = [ { label: 'Solicitadas', value: k.nSolicitadas, total: false, isVencidos: false }, { label: 'Aprobadas', value: k.nAprobadas, total: false, isVencidos: false }, { label: 'Rechazadas', value: k.nRechazadas, total: false, isVencidos: false }, { label: 'Devoluciones', value: k.nDevueltas, total: false, isVencidos: false }, { label: 'En préstamo', value: k.nEnPrestamo, total: true, isVencidos: false }, { label: 'Vencidos', value: vencidosCount, total: true, isVencidos: true }, ]; ---

Estadísticas

Actividad del día ·

{kpis.map((k) => { const isVencidosAlert = k.isVencidos && k.value > 0; return (
{k.label}{k.total ? ' (total)' : ' hoy'}
{k.value}
); })}

Solicitudes por día · últimos {DIAS} días

{solicitudesPorDia.some((d) => d.valor > 0) ? ( ) : (

Sin actividad en los últimos {DIAS} días.

)}

Distribución de estados

{distribEstados.length > 0 ? ( ) : (

Aún no hay solicitudes registradas.

)}

Top 10 materiales · últimos {DIAS} días

{topMateriales.length > 0 ? ( ) : (

Ningún material solicitado en los últimos {DIAS} días.

)}