Saltar al contenido principal

📊 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 asignados
    • getJudgeAssignments() - Obtener hackathons de un juez
    • getScoresForSubmission() - Obtener scores de una submission
    • calculateLeaderboard() - Calcular leaderboard ponderado
    • isJudgeAssigned() - Verificar asignación
    • judgeParticipatesInHackathon() - 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/assignments para 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

🧪 Cómo Probar lo Implementado

Prerequisitos

  1. Usuarios necesarios:

    • 1 usuario con rol ORGANIZER o ADMIN
    • 1 usuario con rol JUDGE
    • 1+ usuarios con rol PARTICIPANT
  2. 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)

  1. Inicia sesión como ORGANIZER o ADMIN
  2. Ve a /admin/hackathons/[slug]/judges
  3. Busca un usuario con rol JUDGE por email
  4. Haz clic en "Asignar"
  5. 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)

  1. Inicia sesión como JUDGE
  2. Ve a /judge/hackathons
  3. 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.tsx para ver submissions
  • No existe /judge/hackathons/[slug]/submissions/[submissionId]/evaluate/page.tsx para evaluar

Lo que debería existir:

  1. Página que lista todas las submissions del hackathon
  2. Por cada submission, mostrar:
    • Título, descripción, repoUrl, demoUrl
    • Equipo y miembros
    • Estado: "Evaluada" o "Pendiente"
  3. Link a página de evaluación individual
  4. Formulario con inputs por criterio
  5. 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:

  1. Leaderboard público (solo visible cuando FINISHED)
  2. Ranking ordenado por puntaje ponderado
  3. 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)

  1. Implementar /judge/hackathons/[slug]/page.tsx

    • Usar getHackathonSubmissionsForJudge() de submissions/queries.ts
    • Mostrar lista de submissions con progreso
    • Link a página de evaluación
  2. 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

  1. Implementar /hackathons/[slug]/leaderboard/page.tsx
    • Usar calculateLeaderboard() de evaluation/queries.ts
    • Mostrar ranking público
    • Solo visible cuando FINISHED

🔍 Archivos Clave para Revisar

Core

  • src/modules/evaluation/queries.ts - Queries de evaluación
  • src/modules/evaluation/actions.ts - Server Actions
  • src/modules/submissions/queries.ts - getHackathonSubmissionsForJudge()

UI Existente

  • src/app/admin/hackathons/[slug]/judges/page.tsx - Gestión de jueces
  • src/app/judge/hackathons/page.tsx - Lista de hackathons asignados
  • src/app/api/judge/assignments/route.ts - API para asignaciones

UI Faltante (a crear)

  • src/app/judge/hackathons/[slug]/page.tsx - Panel de submissions
  • src/app/judge/hackathons/[slug]/submissions/[submissionId]/evaluate/page.tsx - Formulario de evaluación
  • src/app/hackathons/[slug]/leaderboard/page.tsx - Leaderboard público

📝 Notas Importantes

  1. RBAC: Todas las acciones tienen validación de roles correcta
  2. Validaciones: Se valida que el hackathon esté en JUDGING para evaluar
  3. Conflictos: Se previene que un juez participe en el hackathon que juzga
  4. Scores: Los scores se pueden actualizar (upsert) si el juez ya evaluó
  5. Leaderboard: Solo considera scores de jueces vigentes (con HackathonJudge activo)