diff --git a/src/components/admin/round/filtering-dashboard.tsx b/src/components/admin/round/filtering-dashboard.tsx index 1827e1a..afd9b6f 100644 --- a/src/components/admin/round/filtering-dashboard.tsx +++ b/src/components/admin/round/filtering-dashboard.tsx @@ -250,6 +250,7 @@ export function FilteringDashboard({ competitionId, roundId }: FilteringDashboar utils.project.list.invalidate() toast.success( `Finalized: ${data.passed} passed, ${data.filteredOut} filtered out` + + (data.routedToAwards > 0 ? `, ${data.routedToAwards} routed to award tracks` : '') + (data.advancedToStageName ? `. Next round: ${data.advancedToStageName}` : '') ) if (data.categoryWarnings.length > 0) { @@ -483,7 +484,12 @@ export function FilteringDashboard({ competitionId, roundId }: FilteringDashboar This will mark PASSED projects as eligible and FILTERED_OUT projects as rejected. {stats && ( - {stats.passed} will pass, {stats.filteredOut} will be filtered out, {stats.flagged} flagged for review. + {stats.passed - (stats.routedToAwards || 0)} will pass to main pool, {stats.filteredOut} will be filtered out{stats.flagged > 0 ? `, ${stats.flagged} flagged for review` : ''}. + {(stats.routedToAwards || 0) > 0 && ( + + {stats.routedToAwards} already routed to award tracks (excluded from main pool). + + )} )} This action can be reversed but requires manual intervention. diff --git a/src/server/routers/filtering.ts b/src/server/routers/filtering.ts index 990b105..eb264c1 100644 --- a/src/server/routers/filtering.ts +++ b/src/server/routers/filtering.ts @@ -1153,6 +1153,19 @@ export const filteringRouter = router({ const passedIds = passedResults.map((r) => r.projectId) + // Exclude projects confirmed for SEPARATE_POOL award tracks from main pool + const awardRouted = await ctx.prisma.awardEligibility.findMany({ + where: { + projectId: { in: passedIds }, + shortlisted: true, + confirmedAt: { not: null }, + award: { eligibilityMode: 'SEPARATE_POOL' }, + }, + select: { projectId: true }, + }) + const awardRoutedIds = new Set(awardRouted.map((a) => a.projectId)) + const mainPoolPassedIds = passedIds.filter((id) => !awardRoutedIds.has(id)) + const operations: Prisma.PrismaPromise[] = [] if (filteredOutIds.length > 0) { @@ -1164,10 +1177,10 @@ export const filteringRouter = router({ ) } - if (passedIds.length > 0) { + if (mainPoolPassedIds.length > 0) { operations.push( ctx.prisma.project.updateMany({ - where: { id: { in: passedIds } }, + where: { id: { in: mainPoolPassedIds } }, data: { status: 'ELIGIBLE' }, }) ) @@ -1197,7 +1210,8 @@ export const filteringRouter = router({ entityId: input.roundId, detailsJson: { action: 'FINALIZE_FILTERING', - passed: passedIds.length, + passed: mainPoolPassedIds.length, + routedToAwards: awardRoutedIds.size, filteredOut: filteredOutIds.length, demotedToFlagged: demotedIds.length, categoryTargets: input.categoryTargets || null, @@ -1207,7 +1221,8 @@ export const filteringRouter = router({ }) return { - passed: passedIds.length, + passed: mainPoolPassedIds.length, + routedToAwards: awardRoutedIds.size, filteredOut: filteredOutIds.length, demotedToFlagged: demotedIds.length, categoryCounts,