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>