📊 Estado del Módulo de Evaluación (Judging)
✅ Lo que está implementado
1. Core Logic (100% Completo)
Schema Prisma
- ✅ Model
HackathonJudge(asignación de jueces) - ✅ Model
Score(puntajes por criterio) - ✅ Relaciones con
Hackathon,Profile,Submission,Criterion
Module Files
- ✅
src/modules/evaluation/types.ts- Types completos - ✅
src/modules/evaluation/validations.ts- Schemas Zod - ✅
src/modules/evaluation/queries.ts- Queries completas:getHackathonJudges()- Obtener jueces asignadosgetJudgeAssignments()- Obtener hackathons de un juezgetScoresForSubmission()- Obtener scores de una submissioncalculateLeaderboard()- Calcular leaderboard ponderadoisJudgeAssigned()- Verificar asignaciónjudgeParticipatesInHackathon()- Verificar conflicto
- ✅
src/modules/evaluation/actions.ts- Server Actions:assignJudge()- Asignar juez (RBAC: ORGANIZER/ADMIN)removeJudge()- Remover juez (RBAC: ORGANIZER/ADMIN)submitScore()- Enviar puntaje (RBAC: JUDGE)
2. UI Implementada (Parcial)
✅ FASE 8.1: Gestión de Jueces (ORGANIZER/ADMIN)
- ✅
/admin/hackathons/[slug]/judges/page.tsx- Página de gestión - ✅
judges-management-client.tsx- Client component con RBAC - ✅
judges-management-content.tsx- UI de búsqueda y asignación - ✅ Actualización optimista de lista de jueces
- ✅ Validación de conflictos (juez no puede participar)
✅ FASE 8.2: Panel de Juez (Parcial)
- ✅
/judge/hackathons/page.tsx- Lista de hackathons asignados - ✅
judge-hackathons-client.tsx- Muestra hackathons con estado - ✅ Botón "Evaluar" cuando el hackathon está en
JUDGING - ✅ API route
/api/judge/assignmentspara obtener asignaciones
3. UI Faltante (Crítica)
❌ FASE 8.2: Panel de Submissions del Juez
- ❌
/judge/hackathons/[slug]/page.tsx- NO EXISTE- Debería mostrar todas las submissions del hackathon
- Mostrar progreso de evaluación (X/Y evaluadas)
- Lista de submissions con estado (evaluada/pendiente)
- Link a página de evaluación individual
❌ FASE 8.3: Formulario de Evaluación
- ❌
/judge/hackathons/[slug]/submissions/[submissionId]/evaluate/page.tsx- NO EXISTE- Formulario con un input por cada criterio
- Mostrar:
criterion.name,criterion.description,criterion.maxScore - Input numérico (0 - maxScore) por criterio
- Campo opcional de comentario por criterio
- Botón "Enviar evaluación" que llama a
submitScore()múltiples veces - Mostrar scores ya enviados (si existen) para edición
❌ FASE 9: Leaderboard Público
- ❌
/hackathons/[slug]/leaderboard/page.tsx- NO EXISTE- Leaderboard público (solo visible cuando
FINISHED) - Mostrar ranking con puntaje ponderado
- Mostrar posición, equipo, submission, puntaje
- Leaderboard público (solo visible cuando
🧪 Cómo Probar lo Implementado
Prerequisitos
-
Usuarios necesarios:
- 1 usuario con rol
ORGANIZERoADMIN - 1 usuario con rol
JUDGE - 1+ usuarios con rol
PARTICIPANT
- 1 usuario con rol
-
Hackathon necesario:
- Un hackathon creado y publicado
- Con criterios de evaluación definidos
- En estado
JUDGING(para que los jueces puedan evaluar)
Paso 1: Asignar Jueces (ORGANIZER/ADMIN)
- Inicia sesión como
ORGANIZERoADMIN - Ve a
/admin/hackathons/[slug]/judges - Busca un usuario con rol
JUDGEpor email - Haz clic en "Asignar"
- Verifica que el juez aparece en la lista
✅ Lo que debería funcionar:
- Búsqueda de usuarios por email
- Filtrado automático a usuarios con rol
JUDGE - Validación: no permite asignar si el juez ya participa
- Actualización optimista de la lista
❌ Lo que podría fallar:
- Si el juez ya está asignado, debería mostrar error
- Si el juez participa en el hackathon, debería mostrar error
Paso 2: Ver Hackathons Asignados (JUDGE)
- Inicia sesión como
JUDGE - Ve a
/judge/hackathons - Deberías ver los hackathons donde estás asignado
✅ Lo que debería funcionar:
- Lista de hackathons asignados
- Badge de estado del hackathon
- Botón "Evaluar" solo cuando está en
JUDGING - Botón "Ver Leaderboard" cuando está en
FINISHED
❌ Lo que podría fallar:
- Si no hay hackathons asignados, muestra mensaje vacío
- Si el hackathon no está en
JUDGING, el botón "Evaluar" no aparece
Paso 3: Evaluar Submissions (JUDGE) - ⚠️ NO IMPLEMENTADO
❌ Esto NO está implementado aún:
- No existe
/judge/hackathons/[slug]/page.tsxpara ver submissions - No existe
/judge/hackathons/[slug]/submissions/[submissionId]/evaluate/page.tsxpara evaluar
Lo que debería existir:
- Página que lista todas las submissions del hackathon
- Por cada submission, mostrar:
- Título, descripción, repoUrl, demoUrl
- Equipo y miembros
- Estado: "Evaluada" o "Pendiente"
- Link a página de evaluación individual
- Formulario con inputs por criterio
- Envío de scores
Paso 4: Ver Leaderboard (Público) - ⚠️ NO IMPLEMENTADO
❌ Esto NO está implementado aún:
- No existe
/hackathons/[slug]/leaderboard/page.tsx
Lo que debería existir:
- Leaderboard público (solo visible cuando
FINISHED) - Ranking ordenado por puntaje ponderado
- Mostrar: posición, equipo, submission, puntaje
📋 Checklist de Completitud
Core Logic
- Schema Prisma completo
- Types TypeScript
- Validations Zod
- Queries (100%)
- Actions (100%)
- Tests unitarios (verificar si existen)
UI - Gestión de Jueces
- Página de gestión (
/admin/hackathons/[slug]/judges) - Búsqueda de jueces
- Asignar juez
- Remover juez
- Validación de conflictos
- Actualización optimista
UI - Panel de Juez
- Lista de hackathons asignados (
/judge/hackathons) - Lista de submissions de un hackathon (
/judge/hackathons/[slug]) - FALTA - Formulario de evaluación (
/judge/hackathons/[slug]/submissions/[submissionId]/evaluate) - FALTA
UI - Leaderboard
- Leaderboard público (
/hackathons/[slug]/leaderboard) - FALTA
🎯 Próximos Pasos Recomendados
Prioridad ALTA (Crítica para funcionalidad)
-
Implementar
/judge/hackathons/[slug]/page.tsx- Usar
getHackathonSubmissionsForJudge()desubmissions/queries.ts - Mostrar lista de submissions con progreso
- Link a página de evaluación
- Usar
-
Implementar
/judge/hackathons/[slug]/submissions/[submissionId]/evaluate/page.tsx- Obtener criterios del hackathon
- Obtener scores existentes del juez para esta submission
- Formulario con inputs por criterio
- Llamar a
submitScore()por cada criterio
Prioridad MEDIA
- Implementar
/hackathons/[slug]/leaderboard/page.tsx- Usar
calculateLeaderboard()deevaluation/queries.ts - Mostrar ranking público
- Solo visible cuando
FINISHED
- Usar
🔍 Archivos Clave para Revisar
Core
src/modules/evaluation/queries.ts- Queries de evaluaciónsrc/modules/evaluation/actions.ts- Server Actionssrc/modules/submissions/queries.ts-getHackathonSubmissionsForJudge()
UI Existente
src/app/admin/hackathons/[slug]/judges/page.tsx- Gestión de juecessrc/app/judge/hackathons/page.tsx- Lista de hackathons asignadossrc/app/api/judge/assignments/route.ts- API para asignaciones
UI Faltante (a crear)
src/app/judge/hackathons/[slug]/page.tsx- Panel de submissionssrc/app/judge/hackathons/[slug]/submissions/[submissionId]/evaluate/page.tsx- Formulario de evaluaciónsrc/app/hackathons/[slug]/leaderboard/page.tsx- Leaderboard público
📝 Notas Importantes
- RBAC: Todas las acciones tienen validación de roles correcta
- Validaciones: Se valida que el hackathon esté en
JUDGINGpara evaluar - Conflictos: Se previene que un juez participe en el hackathon que juzga
- Scores: Los scores se pueden actualizar (upsert) si el juez ya evaluó
- Leaderboard: Solo considera scores de jueces vigentes (con
HackathonJudgeactivo)