From 0f2ea5975454042392762facf741ae4ca1dd7efb Mon Sep 17 00:00:00 2001 From: Lak-G Date: Tue, 25 Aug 2026 11:37:26 -0700 Subject: [PATCH] =?UTF-8?q?v1.6:=20rol=20docente,=20combobox=20maestros,?= =?UTF-8?q?=20sonido=20notif,=20fecha=201=20d=C3=ADa,=20wrap=20admin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rol docente: - profiles.rol acepta 'alumno'|'docente'|'admin' (migración 0006) - Docente en checkout: no elige maestro; RPC usa su propio nombre como maestro_responsable - Perfil/onboarding condicionales por rol: docente sin semestre ni tutor, label matrícula → "Número de empleado" - catalogo.astro: perfilCompleto para docente solo requiere matrícula Combobox maestros + separar tutores: - maestros.es_tutor bool: subset marcado que aparece en el select de tutor del perfil - MaestroForm: nuevo checkbox "Es tutor"; endpoints POST/PATCH aceptan es_tutor - admin/maestros.astro: columna Tutor con SVG check - perfil/onboarding queries filtran es_tutor=true, activo=true - Checkout SolicitudCart: setEsTutor(e.target.checked)} + /> + Es tutor (aparece en la lista de tutores del perfil de alumnos) {error && ( diff --git a/src/components/admin/solicitudes/AccionesSolicitud.tsx b/src/components/admin/solicitudes/AccionesSolicitud.tsx index 8ca17bb..7e0e573 100644 --- a/src/components/admin/solicitudes/AccionesSolicitud.tsx +++ b/src/components/admin/solicitudes/AccionesSolicitud.tsx @@ -41,7 +41,7 @@ function useDialog() { function AprobarDialog({ prestamo }: { prestamo: Prestamo }) { const dlg = useDialog(); - const [fecha, setFecha] = useState(enDias(7)); + const [fecha, setFecha] = useState(enDias(1)); const [notas, setNotas] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); diff --git a/src/components/admin/solicitudes/VerDetalles.tsx b/src/components/admin/solicitudes/VerDetalles.tsx index c70e550..dd4ecc4 100644 --- a/src/components/admin/solicitudes/VerDetalles.tsx +++ b/src/components/admin/solicitudes/VerDetalles.tsx @@ -197,7 +197,7 @@ export default function VerDetalles({ prestamoId }: { prestamoId: number }) {
Alumno
{data.prestamo.alumno?.nombre ?? data.prestamo.alumno?.email}
Maestro
-
{data.prestamo.maestro_responsable}
+
{data.prestamo.maestro_responsable}
Materiales
    diff --git a/src/components/alumno/SolicitudCart.tsx b/src/components/alumno/SolicitudCart.tsx index df21b37..8a4f38f 100644 --- a/src/components/alumno/SolicitudCart.tsx +++ b/src/components/alumno/SolicitudCart.tsx @@ -39,19 +39,25 @@ export function useCart() { const clamp = (n: number, max: number) => Math.max(1, Math.min(max, n)); +type MaestroOpt = { id: number; nombre: string }; + export default function CartProvider({ materiales, tutorNombre = null, perfilCompleto = true, + esDocente = false, + maestros = [], }: { materiales: Material[]; tutorNombre?: string | null; perfilCompleto?: boolean; + esDocente?: boolean; + maestros?: MaestroOpt[]; }) { const [cart, setCart] = useState>(new Map()); const dialogRef = useRef(null); - const firstFieldRef = useRef(null); - const [maestroResponsable, setMaestroResponsable] = useState(''); + const firstFieldRef = useRef(null); + const [maestroId, setMaestroId] = useState(''); const [notas, setNotas] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); @@ -141,11 +147,12 @@ export default function CartProvider({ setLoading(true); setError(null); try { + const maestroIdNum = maestroId ? Number(maestroId) : null; const res = await fetch('/api/solicitudes', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ - maestro_responsable: maestroResponsable, + maestro_id: esDocente ? null : maestroIdNum, notas: notas || undefined, items: items.map((i) => ({ material_id: i.material_id, @@ -159,7 +166,7 @@ export default function CartProvider({ throw new Error(json?.error ?? 'No se pudo enviar la solicitud'); } setOk(true); - const usedFallback = maestroResponsable.trim() === '' && !!tutorNombre; + const usedFallback = !esDocente && !maestroIdNum && !!tutorNombre; toastAfterReload({ kind: 'success', title: 'Solicitud enviada', @@ -317,30 +324,31 @@ export default function CartProvider({
)} -
- -