PageSourceSearch

https://www.escuelacocteleria.es/assets/evaluations-AZfj7cZs.js

js escuelacocteleria.es collected 2026-10-05 23:04:14 UTC 34,019 bytes, 6 lines download raw bytes

1import{e as Z,a as h,u as B,d as v,j as e,k as qe}from"./vendor-query-BUwfVuOG.js";import{a0 as Re,ad as W,z as b,ae as ee,af as ae,A as C,B as o,V as I,C as $e,a4 as ue,a3 as H,bg as me,aE as Ke,F as xe,X as he,b as f,at as pe,aY as ve,aZ as je,a_ as ge,a$ as fe,bq as Ne,U as Be,ai as J,a as Me,Q as ze,az as ye,aA as be,aB as Ce,aC as we,aD as U,ar as E}from"./index-_mdjBuBr.js";import{T as Oe,a as Qe,b as O,c as Q}from"./tabs-B1cOyxGx.js";import{D as Ve}from"./download-B4H3Qivx.js";import{C as Se}from"./clipboard-check-DSZYUqui.js";import{R as X}from"./rotate-ccw-y1P_J9lA.js";import{E as ke}from"./eye-UECUMKO0.js";import"./vendor-ui-BV6bAOPF.js";import"./vendor-charts-CsidWLaS.js";import"./vendor-motion-CeFdiwAh.js";import"./vendor-forms-D-pbkChx.js";import"./vendor-dates-Dg9w3qQM.js";const Le=Re("Ban",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m4.9 4.9 14.2 14.2",key:"1m5liu"}]]),K="/api/admin/campus-v2/resources";async function Y(t){const r=await t.json().catch(()=>({}));if(!t.ok)throw new Error(r.error||"No se pudo gestionar el recurso");return r}function Ue(){const{toast:t}=W(),r=Z(),[d,w]=h.useState(""),[S,P]=h.useState(""),[k,_]=h.useState(null),[A,T]=h.useState(0),{data:x,isPending:q,isError:M,refetch:R}=B({queryKey:[K],queryFn:async()=>Y(await fetch(K,{credentials:"include"}))}),F=v({mutationFn:async i=>Y(await fetch(K,{method:"POST",body:i,credentials:"include"})),onSuccess:()=>{w(""),P(""),_(null),T(i=>i+1),r.invalidateQueries({queryKey:[K]}),t({title:"Ficha disponible en el Campus Beartender"})},onError:i=>t({title:i.message,variant:"destructive"})}),D=v({mutationFn:async i=>Y(await fetch(`${K}/${i}/hide`,{method:"POST",credentials:"include"})),onSuccess:()=>{r.invalidateQueries({queryKey:[K]}),t({title:"Ficha retirada del Campus"})},onError:i=>t({title:i.message,variant:"destructive"})});function j(i){if(i.preventDefault(),!k||!d.trim())return;const s=new FormData;s.append("title",d.trim()),s.append("description",S.trim()),s.append("file",k),F.mutate(s)}return e.jsxs(b,{children:[e.jsxs(ee,{children:[e.jsx(ae,{children:"Fichas del Curso Bartender Profesional"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Estas fichas se comparten con todos los alumnos autorizados del curso, en la pestaña Recursos. Solo Dirección puede publicarlas o retirarlas."})]}),e.jsxs(C,{className:"space-y-5",children:[q&&e.jsx("p",{children:"Cargando fichas…"}),M&&e.jsxs("div",{role:"alert",children:["No se pudieron cargar las fichas. ",e.jsx(o,{variant:"outline",onClick:()=>R(),children:"Reintentar"})]}),x?.canManage&&e.jsxs("form",{onSubmit:j,className:"grid gap-3 max-w-xl",children:[e.jsx("label",{htmlFor:"campus-resource-title",children:"Título de la ficha"}),e.jsx(I,{id:"campus-resource-title",value:d,maxLength:255,onChange:i=>w(i.target.value),required:!0}),e.jsx("label",{htmlFor:"campus-resource-description",children:"Descripción breve (opcional)"}),e.jsx(I,{id:"campus-resource-description",value:S,maxLength:1e3,onChange:i=>P(i.target.value)}),e.jsx("label",{htmlFor:"campus-resource-file",children:"Archivo PDF (máximo 10 MB)"}),e.jsx(I,{id:"campus-resource-file",type:"file",accept:"application/pdf,.pdf",onChange:i=>_(i.target.files?.[0]||null),required:!0},A),e.jsx(o,{type:"submit",disabled:F.isPending||!k||!d.trim(),children:F.isPending?"Publicando…":"Publicar ficha"})]}),x&&e.jsxs("div",{className:"space-y-2",children:[x.resources.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"Aún no hay fichas añadidas."}),x.resources.map(i=>e.jsxs("div",{className:"flex items-center justify-between gap-4 rounded-lg border p-3",children:[e.jsxs("div",{children:[e.jsxs("p",{className:"font-medium",children:[i.title," ",i.isActive?"":"· retirada"]}),i.description&&e.jsx("p",{className:"text-sm text-muted-foreground",children:i.description})]}),x.canManage&&i.isActive&&e.jsx(o,{variant:"outline",disabled:D.isPending,onClick:()=>{window.confirm(`¿Retirar «${i.title}» del Campus?`)&&D.mutate(i.id)},children:"Retirar"})]},i.id))]})]})]})}async function G(t){const r=await t.json().catch(()=>({}));if(!t.ok)throw new Error(r.error||"No se pudo completar la operación");return r}function Ge({sessionId:t}){const{toast:r}=W(),d=Z(),[w,S]=h.useState(null),[P,k]=h.useState(0),[_,A]=h.useState({}),T=`/api/admin/campus-v2/abcm/convocatoria/${t}`,{data:x,isPending:q,isError:M,error:R,refetch:F}=B({queryKey:[T],queryFn:async()=>G(await fetch(T,{credentials:"include"}))}),D=v({mutationFn:async()=>
1{if(!w)throw new Error("Selecciona el PDF oficial");const s=new FormData;return s.append("file",w),G(await fetch("/api/admin/campus-v2/abcm/template",{method:"POST",credentials:"include",body:s}))},onSuccess:()=>{S(null),k(s=>s+1),r({title:"Formulario ABCM oficial publicado"})},onError:s=>r({title:s.message,variant:"destructive"})}),j=v({mutationFn:async({id:s,decision:N})=>G(await fetch(`/api/admin/campus-v2/abcm/submission/${s}/review`,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({decision:N,note:_[s]?.trim()||void 0})})),onSuccess:()=>{d.invalidateQueries({queryKey:[T]}),r({title:"Revisión registrada"})},onError:s=>r({title:s.message,variant:"destructive"})});async function i(s){try{const{url:N}=await G(await fetch(`/api/admin/campus-v2/abcm/submission/${s}/download`,{credentials:"include"})),g=document.createElement("a");g.href=N,g.target="_blank",g.rel="noopener noreferrer",document.body.appendChild(g),g.click(),g.remove()}catch(N){r({title:N instanceof Error?N.message:"No se pudo descargar",variant:"destructive"})}}return q?e.jsx("p",{children:"Cargando formularios ABCM…"}):M?e.jsxs("div",{role:"alert",children:[R instanceof Error?R.message:"No se pudo cargar ABCM"," ",e.jsx(o,{variant:"outline",onClick:()=>F(),children:"Reintentar"})]}):e.jsxs(b,{children:[e.jsxs(ee,{children:[e.jsx(ae,{children:"Formulario ABCM"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Dirección publica el PDF oficial para el curso. El alumno lo descarga, lo firma y lo sube desde Documentación. Las versiones y entregas anteriores quedan conservadas."})]}),e.jsxs(C,{className:"space-y-6",children:[e.jsxs("div",{className:"max-w-lg space-y-3",children:[e.jsx("label",{htmlFor:"abcm-official-pdf",className:"text-sm font-medium",children:"PDF oficial en blanco (máximo 10 MB)"}),e.jsx(I,{id:"abcm-official-pdf",type:"file",accept:"application/pdf,.pdf",onChange:s=>S(s.target.files?.[0]||null)},P),e.jsx(o,{disabled:!w||w.size>10*1024*1024||D.isPending,onClick:()=>{window.confirm("¿Publicar esta versión del formulario para todos los Beartenders autorizados?")&&D.mutate()},children:D.isPending?"Publicando…":"Publicar formulario oficial"})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"font-semibold",children:"Entregas de esta convocatoria"}),x?.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"Todavía no hay formularios entregados."}),x?.map(s=>e.jsxs("div",{className:"rounded-lg border p-4 space-y-2",children:[e.jsxs("div",{className:"font-medium",children:[s.studentName," · ",s.studentEmail]}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Versión ",s.version," · intento ",s.attemptNumber," · ",s.status==="approved"?"Validado":s.status==="needs_correction"?"Debe corregirse":"Pendiente de revisión"]}),e.jsx(o,{variant:"outline",onClick:()=>i(s.id),children:"Descargar entrega firmada"}),s.status==="submitted"&&e.jsxs("div",{className:"max-w-xl space-y-2",children:[e.jsx("label",{htmlFor:`abcm-review-${s.id}`,className:"text-sm",children:"Motivo de corrección (si procede)"}),e.jsx(I,{id:`abcm-review-${s.id}`,maxLength:1e3,value:_[s.id]||"",onChange:N=>A(g=>({...g,[s.id]:N.target.value}))}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(o,{disabled:j.isPending,onClick:()=>j.mutate({id:s.id,decision:"approved"}),children:"Validar"}),e.jsx(o,{variant:"outline",disabled:j.isPending||!_[s.id]?.trim(),onClick:()=>j.mutate({id:s.id,decision:"needs_correction"}),children:"Pedir corrección"})]})]}),s.reviewNotes&&e.jsxs("p",{className:"text-sm",children:["Observación: ",s.reviewNotes]})]},s.id))]})]})]})}function Ee(t){switch(t){case"superado":return e.jsx(f,{className:"bg-green-600 text-white",children:"Superado"});case"participacion":return e.jsx(f,{className:"bg-yellow-500 text-white",children:"Participación"});case"asistencia":return e.jsx(f,{className:"bg-blue-500 text-white",children:"Asistencia"});case"no_superado":return e.jsx(f,{variant:"destructive",children:"No superado"});case"anulado":return e.jsx(f,{variant:"secondary",className:"text-gray-500",children:"Anulado"});default:return e.jsx(f,{variant:"secondary",children:"Pendiente"})}}function ra(){const{toast:t}=W(),r=Z(),[d,w]=h.useState(()=>{const a=Number(new URLSearchParams(window.location.search).get("sessionId"));return Number.isSafeInteger(a)&&a>0?a:null}),[S,P]=h.useState(null),[k,_]=h.useState(""),[A,T]=h.useState({}),[x,q]=h.useState(null),[M,R]=h.useState({}),[F,D]=h.useState(""),[j,i]=h.useState(""),[s,N]=h.useState(""),[g,se]=h.useState(null),[te,ie]=h.useState(!1),{data:$=[],isLoading:ne}=B({queryKey:["/api/admin/evaluations/convocatorias"]}),{data:c}=B({queryKey:["/api/admin/evaluations/convocatoria",d],queryFn:async()=>{const a=await fetch(`/api/admin/evaluations/convocatoria/${d}`,{credentials:"include"});if(!a.ok)throw new Error("Error");return a.json()},enabled:!!d,placeholderData:qe}),{data:V=[]}=B({queryKey:["/api/admin/evaluations/certificates"]}),{data:Pe=[]}=B({queryKey:["/api/admin/evaluations/courses"]}),re=v({mutationFn:async a=>E("POST","/api/admin/evaluations/attendance",a),onSuccess:()=>{r.invalidateQueries({queryKey:["/api/admin/evaluations/convocatoria",d]})}}),_e=v({mutationFn:async({id:a,present:l,reason:m})=>E("PUT",`/api/admin/evaluations/attendance/${a}
1/correct`,{present:l,reason:m}),onSuccess:()=>{r.invalidateQueries({queryKey:["/api/admin/evaluations/convocatoria",d]}),P(null),_(""),t({title:"Asistencia corregida"})}}),Fe=v({mutationFn:async a=>E("POST","/api/admin/evaluations/grades",a),onSuccess:()=>{r.invalidateQueries({queryKey:["/api/admin/evaluations/convocatoria",d]}),r.invalidateQueries({queryKey:["/api/admin/evaluations/certificates"]}),t({title:"Nota guardada"})},onError:()=>{t({title:"Error al guardar nota",variant:"destructive"})}});v({mutationFn:async a=>E("POST",`/api/admin/evaluations/certificates/${a}/annul`),onSuccess:()=>{r.invalidateQueries({queryKey:["/api/admin/evaluations/certificates"]}),r.invalidateQueries({queryKey:["/api/admin/evaluations/convocatoria",d]}),t({title:"Certificado anulado"})}}),v({mutationFn:async a=>E("POST",`/api/admin/evaluations/certificates/${a}/resend`),onSuccess:()=>{t({title:"Certificado reenviado"})}});const L=v({mutationFn:async a=>E("POST","/api/admin/evaluations/certificates/manual",a),onSuccess:()=>{r.invalidateQueries({queryKey:["/api/admin/evaluations/certificates"]}),r.invalidateQueries({queryKey:["/api/admin/evaluations/convocatoria",d]}),q(null),t({title:"Certificado emitido y enviado"})}}),ce=v({mutationFn:async a=>E("POST",`/api/admin/evaluations/certificate/${a}/send`),onSuccess:()=>{r.invalidateQueries({queryKey:["/api/admin/evaluations/certificates"]}),r.invalidateQueries({queryKey:["/api/admin/evaluations/convocatoria",d]}),t({title:"Certificado enviado al alumno"})},onError:()=>{t({title:"Error al enviar el certificado",variant:"destructive"})}}),le=v({mutationFn:async a=>E("POST",`/api/admin/evaluations/certificate/${a}/regenerate`),onSuccess:()=>{r.invalidateQueries({queryKey:["/api/admin/evaluations/certificates"]}),r.invalidateQueries({queryKey:["/api/admin/evaluations/convocatoria",d]}),t({title:"Certificado regenerado con nuevo número de referencia"})},onError:()=>{t({title:"Error al regenerar el certificado",variant:"destructive"})}}),De=v({mutationFn:async a=>E("POST",`/api/admin/evaluations/enrollment/${a}/cancel`),onSuccess:()=>{r.invalidateQueries({queryKey:["/api/admin/evaluations/convocatoria",d]}),t({title:"Evaluación anulada"})},onError:()=>{t({title:"Error al anular la evaluación",variant:"destructive"})}}),Ie=v({mutationFn:async a=>E("POST",`/api/admin/evaluations/enrollment/${a}/reactivate`),onSuccess:()=>{r.invalidateQueries({queryKey:["/api/admin/evaluations/convocatoria",d]}),t({title:"Evaluación reactivada"})},onError:()=>{t({title:"Error al reactivar la evaluación",variant:"destructive"})}}),oe=(a,l,m)=>{const n=`${a}-${m}`,p=parseFloat(A[n]);if(isNaN(p)||p<0||p>10){t({title:"Nota inválida (0-10)",variant:"destructive"});return}Fe.mutate({enrollmentId:a,courseSessionId:l,criterion:m,grade:p})},de=async()=>{ie(!0);try{const a=new URLSearchParams;F.trim()&&a.set("q",F.trim()),j&&a.set("courseId",j),s&&a.set("sessionId",s);const l=await fetch(`/api/admin/evaluations/certificates/search?${a}`,{credentials:"include"});if(!l.ok)throw new Error("Error en la búsqueda");se(await l.json())}catch{t({title:"Error al buscar certificados",variant:"destructive"})}finally{ie(!1)}},Ae=a=>c?c.currentAdminId==="admin-1"?!0:c.evaluatorCriteriaId?.[a]===c.currentAdminId:!1,Te=$.reduce((a,l)=>{const m=l.courseName||l.courseId;return a[m]||(a[m]=[]),a[m].push(l),a},{});return d&&c?e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs(o,{variant:"ghost",size:"sm",onClick:()=>w(null),children:[e.jsx($e,{className:"h-4 w-4 mr-1"})," Volver"]}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold",children:c.convocatoria.courseName||c.convocatoria.courseId}),e.jsxs("p",{className:"text-muted-foreground",children:[c.convocatoria.dateRange," · ",(c.students||[]).length," alumnos"]})]}),e.jsx("div",{className:"ml-auto",children:e.jsx("a",{href:`/api/admin/evaluations/convocatoria/${d}/export`,download:!0,children:e.jsxs(o,{variant:"outline",size:"sm",children:[e.jsx(Ve,{className:"h-4 w-4 mr-1"})," CSV"]})})})]}),e.jsxs(Oe,{defaultValue:"asistencia",children:[e.jsxs(Qe,{children:[e.jsxs(O,{value:"asistencia",children:[e.jsx(Se,{className:"h-4 w-4 mr-1"})," Asistencia"]}),e.jsxs(O,{value:"notas",children:[e.jsx(ue,{className:"h-4 w-4 mr-1"})," Notas"]}),e.jsxs(O,{value:"certificados",children:[e.jsx(H,{className:"h-4 w-4 mr-1"})," Certificados"]}),c.convocatoria.courseId==="curso-bartender-profesional"&&e.jsxs(O,{value:"recursos",children:[e.jsx(me,{className:"h-4 w-4 mr-1"})," Recursos"]}),c.convocatoria.courseId==="curso-bartender-profesional"&&e.jsxs(O,{value:"abcm",children:[e.jsx(me,{className:"h-4 w-4 mr-1"})," ABCM"]})]}),c.convocatoria.courseId==="curso-bartender-profesional"&&e.jsx(Q,{value:"recursos",className:"mt-4",children:e.jsx(Ue,{})}),c.convocatoria.courseId==="curso-bartender-profesional"&&e.jsx(Q,{value:"abcm",className:"mt-4",children:e.jsx(Ge,{sessionId:c.convocatoria.id})}),e.jsx(Q,{value:"asistencia",className:"mt-4",children:e.jsx(b,{children:e.jsx(C,{className:"p-0",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b bg-muted/50",children:[e.jsx("th",{className:"text-left p-3 sticky left-0 bg-muted/50 min-w-[200px]",children:"Alumno"}),(c.allDates||[]).map(a=>{const l=(c.pastDates||[]).includes(a);return e.jsx("th",{className:`p-2 text-center min-w-[50px] text-xs ${l?"":"opacity-40"}`,children:a.slice(5).replace("-","/")},a)}),e.jsx("th",{className:"p-3 text-center min-w-[80px]",children:"%"})]})}),e.jsx("tbody",{children:(c.students||[]).map(a=>e.jsxs("tr",{className:"border-b hover:bg-muted/30",children:[e.jsx("td",{className:"p-3 sticky left-0 bg-background",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-medium",children:a.enrollment.name}),a.attendance?.atRisk&&e.jsx(Ke,{className:"h-4 w-4 text-amber-500",children:e.jsx("title",{children:"En riesgo de no alcanzar 80% asistencia"})})]})}
1),(c.allDates||[]).map(l=>{const m=(c.pastDates||[]).includes(l),n=(a.attendance?.records||[]).find(p=>p.date===l);return m?e.jsx("td",{className:"p-2 text-center",children:e.jsx("button",{onClick:()=>{n&&(n.correctedBy||n.correctionReason)?P({attendanceId:n.id,present:!n.present}):re.mutate({enrollmentId:a.enrollment.id,courseSessionId:c.convocatoria.id,date:l,present:n?!n.present:!0})},className:`w-7 h-7 rounded-full flex items-center justify-center text-xs font-bold transition-colors
2                                    ${n?.present?"bg-green-100 text-green-700 hover:bg-green-200 dark:bg-green-900/30 dark:text-green-400":n?"bg-red-100 text-red-700 hover:bg-red-200 dark:bg-red-900/30 dark:text-red-400":"bg-gray-100 text-gray-400 hover:bg-gray-200 dark:bg-gray-800 dark:text-gray-500"}
3                                    ${n?.correctedBy?"ring-2 ring-amber-400":""}
4                                  `,title:n?.correctionReason?`Corregido por ${n.correctedBy}: ${n.correctionReason}`:void 0,children:n?.present?e.jsx(xe,{className:"h-3.5 w-3.5"}):n?e.jsx(he,{className:"h-3.5 w-3.5"}):"·"})},l):e.jsx("td",{className:"p-2 text-center",children:e.jsx("button",{onClick:()=>{re.mutate({enrollmentId:a.enrollment.id,courseSessionId:c.convocatoria.id,date:l,present:n?!n.present:!0})},className:`w-7 h-7 rounded-full flex items-center justify-center text-xs font-bold transition-colors opacity-40
5                                      ${n?.present?"bg-green-100 text-green-700 hover:bg-green-200 dark:bg-green-900/30 dark:text-green-400":n?"bg-red-100 text-red-700 hover:bg-red-200 dark:bg-red-900/30 dark:text-red-400":"bg-gray-100 text-gray-400 hover:bg-gray-200 dark:bg-gray-800 dark:text-gray-500"}
6                                    `,title:"Fecha futura",children:n?.present?e.jsx(xe,{className:"h-3.5 w-3.5"}):n?e.jsx(he,{className:"h-3.5 w-3.5"}):"·"})},l)}),e.jsx("td",{className:"p-3 text-center",children:e.jsxs(f,{variant:(a.attendance?.percent??0)>=80?"default":a.attendance?.atRisk?"destructive":"secondary",children:[(a.attendance?.percent??0).toFixed(0),"%"]})})]},a.enrollment.id))})]})})})})}),e.jsx(Q,{value:"notas",className:"mt-4",children:e.jsx(b,{children:e.jsx(C,{className:"p-0",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b bg-muted/50",children:[e.jsx("th",{className:"text-left p-3 min-w-[200px]",children:"Alumno"}),e.jsx("th",{className:"p-3 text-center min-w-[80px]",children:"Asistencia"}),(c.criteriaNames||[]).map(a=>e.jsxs("th",{className:"p-3 text-center min-w-[180px]",children:[a.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase()),c.evaluatorCriteria?.[a]?` (${c.evaluatorCriteria[a]})`:""]},a)),e.jsx("th",{className:"p-3 text-center min-w-[80px]",children:"Media"}),e.jsx("th",{className:"p-3 text-center min-w-[100px]",children:"Estado"})]})}),e.jsx("tbody",{children:(c.students||[]).map(a=>{const l=c.criteriaNames||[];return e.jsxs("tr",{className:"border-b hover:bg-muted/30",children:[e.jsx("td",{className:"p-3 font-medium",children:a.enrollment.name}),e.jsx("td",{className:"p-3 text-center",children:e.jsxs(f,{variant:(a.attendance?.percent??0)>=80?"default":"destructive",children:[(a.attendance?.percent??0).toFixed(0),"%"]})}),l.map(m=>{const n=`${a.enrollment.id}-${m}`,p=(a.grades||{})[m],z=Ae(m);return e.jsx("td",{className:"p-3 text-center",children:z?e.jsx("div",{className:"flex items-center gap-1 justify-center",children:e.jsx(I,{type:"number",step:"0.01",min:"0",max:"10",className:"w-20 h-8 text-center text-sm",value:A[n]??(p!==null?String(p):""),onChange:y=>T(u=>({...u,[n]:y.target.value})),onBlur:()=>{const y=A[n];y!==void 0&&y!==""&&y!==String(p)&&oe(a.enrollment.id,c.convocatoria.id,m)},onKeyDown:y=>{y.key==="Enter"&&oe(a.enrollment.id,c.convocatoria.id,m)},placeholder:"-"})}):e.jsx("span",{className:"text-muted-foreground",children:p!==null?String(p):"-"})},m)}),e.jsx("td",{className:"p-3 text-center font-bold",children:a.average!==null?a.average.toFixed(2):"-"}),e.jsx("td",{className:"p-3 text-center",children:Ee(a.evaluationStatus)})]},a.enrollment.id)})})]})})})})}),e.jsx(Q,{value:"certificados",className:"mt-4",children:e.jsx(b,{children:e.jsxs(C,{className:"pt-6",children:[e.jsxs("div",{className:"mb-6",children:[e.jsx("h3",{className:"font-semibold text-sm text-muted-foreground uppercase tracking-wide mb-3",children:"Estado y acciones por alumno"}),e.jsx("div",{className:"space-y-2",children:(c.students||[]).map(a=>e.jsxs("div",{className:"flex items-center gap-3 p-3 bg-muted/30 rounded-lg",children:[e.jsx("span",{className:"font-medium text-sm flex-1",children:a.enrollment.name}),Ee(a.evaluationStatus),e.jsxs("div",{className:"flex gap-1 ml-auto",children:[a.certificate?.status==="pending_review"&&e.jsxs(o,{size:"sm",variant:"outline",className:"gap-1",onClick:()=>ce.mutate(a.certificate.id),children:[e.jsx(pe,{className:"h-3.5 w-3.5"}
6)," Enviar certificado"]}),a.certificate?.status==="sent"&&e.jsxs(o,{size:"sm",variant:"outline",className:"gap-1",onClick:()=>{confirm("¿Regenerar el certificado? Se asignará un nuevo número de referencia.")&&le.mutate(a.certificate.id)},children:[e.jsx(X,{className:"h-3.5 w-3.5"})," Regenerar"]}),a.evaluationStatus!=="anulado"&&e.jsxs(o,{size:"sm",variant:"ghost",className:"text-red-600 gap-1",onClick:()=>{confirm(`¿Anular la evaluación de ${a.enrollment.name}?`)&&De.mutate(a.enrollment.id)},children:[e.jsx(Le,{className:"h-3.5 w-3.5"})," Anular evaluación"]}),a.evaluationStatus==="anulado"&&e.jsxs(o,{size:"sm",variant:"outline",className:"gap-1",onClick:()=>Ie.mutate(a.enrollment.id),children:[e.jsx(X,{className:"h-3.5 w-3.5"})," Reactivar"]})]})]},a.enrollment.id))})]}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b bg-muted/50",children:[e.jsx("th",{className:"text-left p-3",children:"Alumno"}),e.jsx("th",{className:"p-3 text-center",children:"Tipo"}),e.jsx("th",{className:"p-3 text-center",children:"Referencia"}),e.jsx("th",{className:"p-3 text-center",children:"Fecha"}),e.jsx("th",{className:"p-3 text-center",children:"Estado"}),e.jsx("th",{className:"p-3 text-center",children:"Acciones"})]})}),e.jsxs("tbody",{children:[V.filter(a=>a.courseSessionId===d).map(a=>e.jsxs("tr",{className:"border-b hover:bg-muted/30",children:[e.jsx("td",{className:"p-3 font-medium",children:a.studentName}),e.jsx("td",{className:"p-3 text-center",children:e.jsx(f,{variant:a.type==="superacion"?"default":"secondary",className:a.type==="superacion"?"bg-green-600":a.type==="no_superado"?"bg-red-600 text-white":"",children:a.type==="superacion"?"Superación":a.type==="participacion"?"Participación":a.type==="asistencia_no_aprobado"?"Asistencia (no aprobado)":a.type==="no_superado"?"No superado":"Asistencia"})}),e.jsx("td",{className:"p-3 text-center font-mono text-xs",children:a.referenceNumber}),e.jsx("td",{className:"p-3 text-center",children:new Date(a.issuedAt).toLocaleDateString("es-ES")}),e.jsx("td",{className:"p-3 text-center",children:e.jsx(f,{variant:a.status==="sent"||a.status==="vigente"?"default":a.status==="pending_review"?"outline":"destructive",className:a.status==="sent"||a.status==="vigente"?"bg-green-600 text-white":a.status==="pending_review"?"border-yellow-500 text-yellow-700":"",children:a.status==="sent"?"Enviado":a.status==="vigente"?"Vigente":a.status==="pending_review"?"Pendiente revisión":"Cancelado"})}),e.jsx("td",{className:"p-3 text-center",children:e.jsxs("div",{className:"flex gap-1 justify-center",children:[e.jsx(o,{size:"sm",variant:"ghost",onClick:()=>window.open(`/api/admin/evaluations/certificates/${a.id}/pdf`,"_blank"),title:"Ver certificado",children:e.jsx(ke,{className:"h-3.5 w-3.5"})}),a.status==="pending_review"&&e.jsx(o,{size:"sm",variant:"ghost",onClick:()=>ce.mutate(a.id),title:"Enviar certificado al alumno",children:e.jsx(pe,{className:"h-3.5 w-3.5"})}),a.status==="sent"&&e.jsx(o,{size:"sm",variant:"ghost",onClick:()=>{confirm("¿Regenerar este certificado? Se generará un nuevo número de referencia.")&&le.mutate(a.id)},title:"Regenerar certificado",children:e.jsx(X,{className:"h-3.5 w-3.5"})})]})})]},a.id)),V.filter(a=>a.courseSessionId===d).length===0&&e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"p-8 text-center text-muted-foreground",children:"No hay certificados emitidos para esta convocatoria"})})]})]})})]})})})]}),e.jsx(ve,{open:!!S,onOpenChange:()=>P(null),children:e.jsxs(je,{children:[e.jsx(ge,{children:e.jsx(fe,{children:"Corregir asistencia"})}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:"Indica el motivo de la corrección:"}),e.jsx(I,{value:k,onChange:a=>_(a.target.value),placeholder:"Ej: justificado, se olvidó fichar..."})]}),e.jsxs(Ne,{children:[e.jsx(o,{variant:"outline",onClick:()=>P(null),children:"Cancelar"}),e.jsx(o,{onClick:()=>{S&&k.trim()&&_e.mutate({id:S.attendanceId,present:S.present,reason:k})},disabled:!k.trim(),children:"Guardar corrección"})]})]})}),e.jsx(ve,{open:!!x,onOpenChange:()=>q(null),children:e.jsxs(je,{children:[e.jsx(ge,{children:e.jsx(fe,{children:"Emitir certificado manual"})}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Alumno: ",e.jsx("strong",{children:x?.studentName}),e.jsx("br",{}),"Selecciona el tipo de certificado a emitir:"]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsx(o,{className:"bg-green-600 hover:bg-green-700",onClick:()=>{x&&L.mutate({...x,type:"superacion"})},children:"Superación"}),e.jsx(o,{variant:"secondary",onClick:()=>{x&&L.mutate({...x,type:"participacion"})},children:"Participación"}),e.jsx(o,{variant:"secondary",onClick:()=>{x&&L.mutate({...x,type:"asistencia_no_aprobado"})},children:"Asistencia (no aprobado)"}),e.jsx(o,{variant:"destructive",onClick:()=>{x&&L.mutate({...x,type:"no_superado"})},children:"No superado"})]}),e.jsx(Ne,{children:e.jsx(o,{variant:"outline",onClick:()=>q(null),children:"Cancelar"})})]})})]}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[e.jsx(Se,{className:"h-6 w-6"})," Evaluaciones"]}),e.jsx("p",{className:"text-muted-foreground",children:"Gestión de asistencia, notas y certificados de los cursos"})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-3",children:[e.jsx(b,{children:e.jsxs(C,{className:"pt-6 text-center",children:[e.jsx(Be,{className:"h-8 w-8 mx-auto mb-2 text-primary"}),e.jsx("div",{className:"text-2xl font-bold",children:$.reduce((a,l)=>a+l.enrollmentCount,0)}),e.jsx("div",{className:"text-sm text-muted-foreground",children:"Total alumnos matriculados"})]})}),e.jsx(b,{children:e.jsxs(C,{className:"pt-6 text-center",children:[e.jsx(J,{className:"h-8 w-8 mx-auto mb-2 text-blue-600"}),e.jsx("div",{className:"text-2xl font-bold",children:$.filter(a=>
6a.status==="en_curso").length}),e.jsxs("div",{className:"text-sm text-muted-foreground",children:["En curso / ",$.filter(a=>a.status==="proxima").length," próximas"]})]})}),e.jsx(b,{children:e.jsxs(C,{className:"pt-6 text-center",children:[e.jsx(H,{className:"h-8 w-8 mx-auto mb-2 text-amber-500"}),e.jsx("div",{className:"text-2xl font-bold",children:V.filter(a=>a.status!=="cancelled").length}),e.jsx("div",{className:"text-sm text-muted-foreground",children:"Certificados emitidos"})]})})]}),ne?e.jsx("div",{className:"text-center p-8 text-muted-foreground",children:"Cargando convocatorias..."}):Object.entries(Te).map(([a,l])=>{const m=l.filter(u=>u.status==="en_curso"),n=l.filter(u=>u.status==="proxima"),p=l.filter(u=>u.status==="finalizada"),z=M[a]!==!1,y=u=>e.jsxs(b,{className:"cursor-pointer hover:shadow-md transition-shadow",onClick:()=>w(u.id),children:[e.jsx(ee,{className:"pb-2",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(ae,{className:"text-base",children:u.dateRange}),e.jsx(f,{variant:u.status==="en_curso"?"default":u.status==="proxima"?"outline":"secondary",children:u.status==="en_curso"?"En curso":u.status==="proxima"?"Próxima":"Finalizada"})]})}),e.jsx(C,{children:e.jsxs("div",{className:"grid grid-cols-3 gap-2 text-center text-sm",children:[e.jsxs("div",{children:[e.jsx("div",{className:"font-bold text-lg",children:u.enrollmentCount}),e.jsx("div",{className:"text-muted-foreground text-xs",children:"Alumnos"})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"font-bold text-lg",children:[u.gradingProgress.completed,"/",u.gradingProgress.total]}),e.jsx("div",{className:"text-muted-foreground text-xs",children:"Calificados"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"font-bold text-lg",children:u.certificatesIssued}),e.jsx("div",{className:"text-muted-foreground text-xs",children:"Certificados"})]})]})})]},u.id);return e.jsxs("div",{className:"space-y-3",children:[e.jsxs("h2",{className:"text-lg font-semibold flex items-center gap-2",children:[e.jsx(ue,{className:"h-5 w-5"})," ",a]}),m.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-medium text-primary flex items-center gap-1",children:[e.jsx(J,{className:"h-3.5 w-3.5"})," En curso"]}),e.jsx("div",{className:"grid gap-3 md:grid-cols-2 lg:grid-cols-3",children:m.map(y)})]}),n.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h3",{className:"text-sm font-medium text-blue-600 flex items-center gap-1",children:[e.jsx(J,{className:"h-3.5 w-3.5"})," Próximas"]}),e.jsx("div",{className:"grid gap-3 md:grid-cols-2 lg:grid-cols-3",children:n.map(y)})]}),p.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("button",{className:"text-sm font-medium text-muted-foreground flex items-center gap-1 hover:text-foreground transition-colors",onClick:()=>R(u=>({...u,[a]:!z})),children:[z?e.jsx(Me,{className:"h-3.5 w-3.5"}):e.jsx(ze,{className:"h-3.5 w-3.5"}),"Finalizadas (",p.length,")"]}),!z&&e.jsx("div",{className:"grid gap-3 md:grid-cols-2 lg:grid-cols-3",children:p.map(y)})]})]},a)}),!ne&&$.length===0&&e.jsx(b,{children:e.jsx(C,{className:"p-8 text-center text-muted-foreground",children:"No hay convocatorias de cursos disponibles"})}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("h2",{className:"text-lg font-semibold flex items-center gap-2",children:[e.jsx(H,{className:"h-5 w-5"})," Buscador de certificados"]}),e.jsx(b,{children:e.jsxs(C,{className:"pt-6 space-y-4",children:[e.jsxs("div",{className:"flex flex-wrap gap-3",children:[e.jsx(I,{className:"w-64",placeholder:"Nombre, email o DNI...",value:F,onChange:a=>D(a.target.value),onKeyDown:a=>{a.key==="Enter"&&de()}}),e.jsxs(ye,{value:j||"__all__",onValueChange:a=>{i(a==="__all__"?"":a),N("")},children:[e.jsx(be,{className:"w-48",children:e.jsx(Ce,{placeholder:"Todos los cursos"})}),e.jsxs(we,{children:[e.jsx(U,{value:"__all__",children:"Todos los cursos"}),Pe.filter(a=>a.courseId).map(a=>e.jsx(U,{value:a.courseId,children:a.courseName},a.courseId))]})]}),e.jsxs(ye,{value:s||"__all__",onValueChange:a=>N(a==="__all__"?"":a),disabled:!j,children:[e.jsx(be,{className:"w-48",children:e.jsx(Ce,{placeholder:"Todas las convocatorias"})}),e.jsxs(we,{children:[e.jsx(U,{value:"__all__",children:"Todas las convocatorias"}),$.filter(a=>a.id&&(!j||a.courseId===j)).map(a=>e.jsx(U,{value:String(a.id),children:a.dateRange},a.id))]})]}
6),e.jsx(o,{onClick:de,disabled:te,children:te?"Buscando...":"Buscar"}),g!==null&&e.jsx(o,{variant:"ghost",onClick:()=>se(null),children:"Limpiar"})]}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b bg-muted/50",children:[e.jsx("th",{className:"text-left p-3",children:"Alumno"}),e.jsx("th",{className:"p-3 text-center",children:"Email"}),e.jsx("th",{className:"p-3 text-center",children:"DNI"}),e.jsx("th",{className:"p-3 text-center",children:"Tipo"}),e.jsx("th",{className:"p-3 text-center",children:"Referencia"}),e.jsx("th",{className:"p-3 text-center",children:"Fecha"}),e.jsx("th",{className:"p-3 text-center",children:"Estado"}),e.jsx("th",{className:"p-3 text-center",children:"PDF"})]})}),e.jsxs("tbody",{children:[(g??V.slice(0,50)).map(a=>e.jsxs("tr",{className:"border-b hover:bg-muted/30",children:[e.jsx("td",{className:"p-3 font-medium",children:a.studentName}),e.jsx("td",{className:"p-3 text-center text-xs text-muted-foreground",children:a.enrollment_email||"-"}),e.jsx("td",{className:"p-3 text-center text-xs font-mono",children:a.dni||"-"}),e.jsx("td",{className:"p-3 text-center",children:e.jsx(f,{variant:a.type==="superacion"?"default":"secondary",className:a.type==="superacion"?"bg-green-600":a.type==="no_superado"?"bg-red-600 text-white":"",children:a.type==="superacion"?"Superación":a.type==="participacion"?"Participación":a.type==="asistencia_no_aprobado"?"Asistencia":"No superado"})}),e.jsx("td",{className:"p-3 text-center font-mono text-xs",children:a.referenceNumber}),e.jsx("td",{className:"p-3 text-center",children:new Date(a.issuedAt).toLocaleDateString("es-ES")}),e.jsx("td",{className:"p-3 text-center",children:e.jsx(f,{variant:a.status==="sent"||a.status==="vigente"?"default":a.status==="pending_review"?"outline":"destructive",className:a.status==="sent"||a.status==="vigente"?"bg-green-600 text-white":a.status==="pending_review"?"border-yellow-500 text-yellow-700":"",children:a.status==="sent"?"Enviado":a.status==="vigente"?"Vigente":a.status==="pending_review"?"Pendiente revisión":"Cancelado"})}),e.jsx("td",{className:"p-3 text-center",children:e.jsx(o,{size:"sm",variant:"ghost",onClick:()=>window.open(`/api/admin/evaluations/certificates/${a.id}/pdf`,"_blank"),title:"Ver PDF",children:e.jsx(ke,{className:"h-3.5 w-3.5"})})})]},a.id)),g!==null&&g.length===0&&e.jsx("tr",{children:e.jsx("td",{colSpan:8,className:"p-8 text-center text-muted-foreground",children:"No se encontraron certificados"})})]})]})})]})})]})]})}export{ra as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.