fix: surface advance-type criterion in ranking yes/no counts
All checks were successful
Build and Push Docker Image / build (push) Successful in 8m7s

The ranking dashboard showed 0/X Yes for every project in rounds using
the 'advance' criterion type because the matcher only looked for
type === 'boolean' with a "move to the next stage" label.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matt
2026-04-23 14:03:26 +02:00
parent f37a9b49b5
commit be4449e4ef
2 changed files with 11 additions and 5 deletions

View File

@@ -443,7 +443,9 @@ export const rankingRouter = router({
roundEvaluationScores: adminProcedure roundEvaluationScores: adminProcedure
.input(z.object({ roundId: z.string() })) .input(z.object({ roundId: z.string() }))
.query(async ({ ctx, input }) => { .query(async ({ ctx, input }) => {
// Find the boolean criterion ID across all active forms (shared + category-specific) // Find the advance-decision criterion ID across all active forms (shared + category-specific).
// Current forms use type === 'advance' (one allowed per form). Legacy forms used
// type === 'boolean' with a "move to the next stage" label.
const activeForms = await ctx.prisma.evaluationForm.findMany({ const activeForms = await ctx.prisma.evaluationForm.findMany({
where: { roundId: input.roundId, isActive: true }, where: { roundId: input.roundId, isActive: true },
select: { criteriaJson: true }, select: { criteriaJson: true },
@@ -453,9 +455,9 @@ export const rankingRouter = router({
const fc = (f.criteriaJson as Array<{ const fc = (f.criteriaJson as Array<{
id: string; label: string; type?: string id: string; label: string; type?: string
}> | null) ?? [] }> | null) ?? []
const found = fc.find( const found =
(c) => c.type === 'boolean' && c.label?.toLowerCase().includes('move to the next stage'), fc.find((c) => c.type === 'advance') ??
) fc.find((c) => c.type === 'boolean' && c.label?.toLowerCase().includes('move to the next stage'))
if (found) { if (found) {
boolCriterionId = found.id boolCriterionId = found.id
break break

View File

@@ -256,10 +256,14 @@ function anonymizeProjectsForRanking(
} }
/** /**
* Find the boolean criterion ID for "Move to the Next Stage?" from criteria definitions. * Find the advance-decision criterion ID from criteria definitions.
* Current forms use type === 'advance' (one allowed per form). Legacy forms used
* type === 'boolean' with a "move to the next stage" label.
* Accepts criteria from EvaluationForm.criteriaJson (preferred) or round configJson (legacy). * Accepts criteria from EvaluationForm.criteriaJson (preferred) or round configJson (legacy).
*/ */
function findBooleanCriterionId(criterionDefs: Array<{ id: string; label: string; type?: string }>): string | null { function findBooleanCriterionId(criterionDefs: Array<{ id: string; label: string; type?: string }>): string | null {
const advanceCriterion = criterionDefs.find((c) => c.type === 'advance')
if (advanceCriterion) return advanceCriterion.id
const boolCriterion = criterionDefs.find( const boolCriterion = criterionDefs.find(
(c) => c.type === 'boolean' && c.label?.toLowerCase().includes('move to the next stage'), (c) => c.type === 'boolean' && c.label?.toLowerCase().includes('move to the next stage'),
) )