diff --git a/src/server/routers/specialAward.ts b/src/server/routers/specialAward.ts
index 621a393..a9d357e 100644
--- a/src/server/routers/specialAward.ts
+++ b/src/server/routers/specialAward.ts
@@ -60,7 +60,7 @@ export const specialAwardRouter = router({
select: { id: true, title: true, teamName: true },
},
program: {
- select: { id: true, name: true },
+ select: { id: true, name: true, year: true },
},
},
})
@@ -85,6 +85,7 @@ export const specialAwardRouter = router({
name: z.string().min(1),
description: z.string().optional(),
criteriaText: z.string().optional(),
+ useAiEligibility: z.boolean().optional(),
scoringMode: z.enum(['PICK_WINNER', 'RANKED', 'SCORED']),
maxRankedPicks: z.number().int().min(1).max(20).optional(),
autoTagRulesJson: z.record(z.unknown()).optional(),
@@ -102,6 +103,7 @@ export const specialAwardRouter = router({
name: input.name,
description: input.description,
criteriaText: input.criteriaText,
+ useAiEligibility: input.useAiEligibility ?? true,
scoringMode: input.scoringMode,
maxRankedPicks: input.maxRankedPicks,
autoTagRulesJson: input.autoTagRulesJson as Prisma.InputJsonValue ?? undefined,
@@ -130,6 +132,7 @@ export const specialAwardRouter = router({
name: z.string().min(1).optional(),
description: z.string().optional(),
criteriaText: z.string().optional(),
+ useAiEligibility: z.boolean().optional(),
scoringMode: z.enum(['PICK_WINNER', 'RANKED', 'SCORED']).optional(),
maxRankedPicks: z.number().int().min(1).max(20).optional(),
autoTagRulesJson: z.record(z.unknown()).optional(),
@@ -220,18 +223,24 @@ export const specialAwardRouter = router({
* Run auto-tag + AI eligibility
*/
runEligibility: adminProcedure
- .input(z.object({ awardId: z.string() }))
+ .input(z.object({
+ awardId: z.string(),
+ includeSubmitted: z.boolean().optional(),
+ }))
.mutation(async ({ ctx, input }) => {
const award = await ctx.prisma.specialAward.findUniqueOrThrow({
where: { id: input.awardId },
include: { program: true },
})
- // Get all projects in the program's rounds
+ // Get projects in the program's rounds
+ const statusFilter = input.includeSubmitted
+ ? (['SUBMITTED', 'ELIGIBLE', 'ASSIGNED', 'SEMIFINALIST', 'FINALIST'] as const)
+ : (['ELIGIBLE', 'ASSIGNED', 'SEMIFINALIST', 'FINALIST'] as const)
const projects = await ctx.prisma.project.findMany({
where: {
round: { programId: award.programId },
- status: { in: ['ELIGIBLE', 'ASSIGNED', 'SEMIFINALIST', 'FINALIST'] },
+ status: { in: [...statusFilter] },
},
select: {
id: true,
@@ -259,9 +268,9 @@ export const specialAwardRouter = router({
autoResults = applyAutoTagRules(autoTagRules, projects)
}
- // Phase 2: AI interpretation (if criteria text exists)
+ // Phase 2: AI interpretation (if criteria text exists AND AI eligibility is enabled)
let aiResults: Map | undefined
- if (award.criteriaText) {
+ if (award.criteriaText && award.useAiEligibility) {
const aiEvals = await aiInterpretCriteria(award.criteriaText, projects)
aiResults = new Map(
aiEvals.map((e) => [