Exclude SEPARATE_POOL award projects from main pool finalization
All checks were successful
Build and Push Docker Image / build (push) Successful in 9m47s

- finalizeResults now queries confirmed SEPARATE_POOL shortlist and
  excludes those projects from the main pool ELIGIBLE set
- Finalize confirmation dialog shows breakdown: main pool vs award-routed
- Finalize toast includes award-routed count
- Audit log records routedToAwards count

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Matt
2026-02-18 10:28:45 +01:00
parent 35f30af7ce
commit fc7a37094b
2 changed files with 26 additions and 5 deletions

View File

@@ -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<unknown>[] = []
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,