Modelo
GradeCategory (peso, drop_lowest)
└── GradeItem (actividad — quiz, assignment, manual; vínculo opcional a lección, dueDate, isPublished)
└── Grade (nota por alumno)
└── Rubric (opcional — criterios)
Cálculo (exportación CSV)
La exportación CSV calcula la nota final ponderada de la siguiente manera:
courseGrade = Σ (categoryAvg × categoryWeight) / Σ pesosUsados
categoryAvg = average(itemPercents después de descartar el drop_lowest de la categoría)
itemPercent = studentScore / itemMaxScore × 100
Los ítems sin categoría se ponderan por su propio GradeItem.weight. Solo se tienen en cuenta los ítems publicados.
Roadmap: la penalización automática por retraso (
submittedAt > dueDate) y la publicación programada por fecha aún no están implementadas.dueDatese almacena y se muestra;isPublishedcontrola la visibilidad.
Rúbricas
{
"name": "Redacción ENEM",
"criteria": [
{
"name": "Dominio de la norma culta",
"weight": 0.2,
"levels": [
{ "score": 200, "label": "Excelente", "description": "..." },
{ "score": 160, "label": "Bueno", "description": "..." },
{ "score": 120, "label": "Regular", "description": "..." }
]
},
{
"name": "Comprensión del tema",
"weight": 0.2,
"levels": [...]
}
]
}
El alumno ve el desglose expandible: nota final + cada criterio + comentario.
Flags de integridad
El QuizAttempt persiste tabSwitchCount, copyPasteCount, blurCount, timeSpentSec total, IP y user-agent. Un 🛡️ ShieldAlert aparece junto a la nota del quiz en el gradebook cuando el intento está flagged — ej.: tab switches por encima del máximo configurado, tiempo superior al límite, o intentos de copy/paste mientras esta función está bloqueada. El tiempo promedio por pregunta se deriva de timeSpentSec ÷ nº de preguntas (no es una columna almacenada). El tooltip muestra el motivo del flag. El profesor decide la acción (anular, mantener, revisar).
Exportación
GET /api/institution/gradebook/[courseId]/export devuelve un CSV con:
- Alumno
- Cada GradeItem como columna
- Media ponderada (por categoría + drop-lowest)
Compatible con Google Sheets y Excel.