El trigger prestamos_on_auth_user_created coexiste con otro trigger del
proyecto vecino en auth.users y no siempre dispara. Consecuencia:
usuarios que hacían login vía OAuth entraban con user pero sin profile,
y la app los trataba como "no logueado".
- Middleware: si hay user y no hay profile (email @uabc.edu.mx), upsert
del profile con datos del OAuth (nombre desde user_metadata.full_name).
- Migración 0005: policy RLS profiles_insert_self con check
(id=auth.uid() and rol='alumno') — impide escalación a admin desde el
self-heal.
- Backfill manual ejecutado en prod para los 8 users @uabc.edu.mx que
ya existían en auth.users pero no tenían profile.
El vale físico del LSC permite pedir varios materiales en un solo
trámite; el sistema modelaba 1 solicitud = 1 material. Migra
prestamos.prestamos -> solicitudes (cabecera) + solicitud_items
(renglones), vía RENAME + backfill (preserva ids/historial real).
- RPC prestamos.crear_solicitud: transaccional, lockea materiales
por fila, arregla la race condition del insert directo anterior.
El alumno ya no inserta directo (RLS lo bloquea).
- sync_stock/log_estado reescritos para iterar renglones por vale.
- maestro_responsable (por vale) y profiles.semestre (perfil,
nullable, sin UI todavía — onboarding queda para después).
- Alumno: carrito (SolicitudCart/AgregarMaterial) reemplaza el
modal de solicitud único por material.
- Admin: 3 vistas de solicitudes, reportes y CSV export listan
renglones por vale; api/admin/prestamos -> api/admin/solicitudes.
De paso corrige un bug preexistente en detalles.ts (audit_log
nunca se ordenaba por la columna correcta).
Verificado: build limpio, ciclo RPC+triggers probado en una
transacción revertida en prod (sin residuo), 9 vistas SSR
smoke-testeadas contra el schema real.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sistema web para gestión de préstamos de material del Laboratorio de
Sistemas Computacionales de la UABC.
- Backend: Supabase self-hosted, schema aislado `prestamos` con RLS,
triggers de stock y audit log (supabase/migrations/0001_init.sql).
- Auth: Google OAuth restringido a @uabc.edu.mx, verificado en
middleware y como segunda línea en trigger de DB.
- Frontend: Astro 7 (SSR con adapter Node) + React islands + Tailwind
v4 con paleta UABC (primary #00723F, secondary #DD971A) bajo regla
60/30/10.
- Interfaz alumno mobile-first: catálogo con filtro por categorías,
solicitud de préstamos, historial personal.
- Interfaz admin desktop-first: panel con KPIs, bandeja de solicitudes
(aprobar/rechazar/devolver), CRUD de inventario y categorías,
reportes filtrables con export CSV nativo.
- Modales con `<dialog>` nativo, cero librerías de UI adicionales.
- Deploy: Dockerfile multi-stage node:22-alpine + docker-compose para
publicar bajo prestamos.buglabs.dev vía Cloudflare Tunnel.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>