--- import AppLayout from '@/layouts/AppLayout.astro'; const supabase = Astro.locals.supabase; const today = new Date().toISOString().split('T')[0]; const [pend, activos, vencidos, agotados, ultimas] = await Promise.all([ supabase.from('solicitudes').select('*', { count: 'exact', head: true }).eq('estado', 'pendiente'), supabase.from('solicitudes').select('*', { count: 'exact', head: true }).in('estado', ['aprobado', 'activo']), supabase.from('solicitudes').select('*', { count: 'exact', head: true }).in('estado', ['aprobado', 'activo']).lt('fecha_devolucion_estimada', today), supabase.from('materiales').select('*', { count: 'exact', head: true }).eq('cantidad_disponible', 0), supabase .from('solicitudes') .select('id, fecha_solicitud, estado, alumno:profiles!alumno_id(nombre, email), items:solicitud_items(cantidad, material:materiales(nombre))') .order('fecha_solicitud', { ascending: false }) .limit(5), ]); const fmtFecha = new Intl.DateTimeFormat('es-MX', { dateStyle: 'medium', timeStyle: 'short' }); const kpis = [ { label: 'Pendientes', value: pend.count ?? 0, href: '/admin/solicitudes', tone: 'primary' }, { label: 'En préstamo', value: activos.count ?? 0, href: '/admin/solicitudes/activos', tone: 'secondary' }, { label: 'Vencidos', value: vencidos.count ?? 0, href: '/admin/solicitudes/activos', tone: 'danger' }, { label: 'Agotados', value: agotados.count ?? 0, href: '/admin/inventario', tone: 'ink' }, ]; const estadoLabel: Record = { pendiente: 'Pendiente', aprobado: 'En préstamo', activo: 'En préstamo', devuelto: 'Devuelto', rechazado: 'Rechazado', vencido: 'Vencido', }; ---

Panel

Resumen del laboratorio.

{kpis.map((k) => (
{k.value}
{k.label}
))}

Últimas 5 solicitudes

Ver todas
{ultimas.data && ultimas.data.length > 0 ? ( {ultimas.data.map((r: any) => ( ))}
Alumno Material Estado Solicitado
{r.alumno?.nombre ?? r.alumno?.email ?? '—'}
{(r.items ?? []).map((i: any) => (
{i.cantidad}× {i.material?.nombre ?? '—'}
))}
{estadoLabel[r.estado] ?? r.estado} {fmtFecha.format(new Date(r.fecha_solicitud))}
) : (

Aún no hay solicitudes registradas.

)}