diff --git a/app/routes/admin.sports-seasons.$id.events.$eventId.bracket.server.ts b/app/routes/admin.sports-seasons.$id.events.$eventId.bracket.server.ts index 88d3ccd..21ae56c 100644 --- a/app/routes/admin.sports-seasons.$id.events.$eventId.bracket.server.ts +++ b/app/routes/admin.sports-seasons.$id.events.$eventId.bracket.server.ts @@ -212,7 +212,7 @@ export async function action({ request, params }: Route.ActionArgs) { /** * Auto-complete a round when every match in it is marked complete. * Updates scoringEvents.playoffRound and calls processPlayoffEvent so that - * non-bracket eliminations are recorded and probabilities are refreshed. + * round placements are recorded and probabilities are refreshed. * This replaces the manual "Complete Round" button. * * skipRecalculate=true because the caller already sent a Discord notification @@ -552,8 +552,10 @@ export async function action({ request, params }: Route.ActionArgs) { }; } - // Process playoff event to update participant results - await processPlayoffEvent(params.eventId); + // Process playoff event to update participant results. + // skipRecalculate=true: match winners were already set via set-winner/set-round-winners, + // which triggered recalculateAffectedLeagues and Discord per match. No need to re-fire. + await processPlayoffEvent(params.eventId, undefined, { skipRecalculate: true }); return { success: `${round} completed and placements calculated successfully`, @@ -690,7 +692,7 @@ export async function action({ request, params }: Route.ActionArgs) { return { error: "No bracket exists for this event" }; } - // Get template to determine round order + // Verify the event has a valid bracket template configured const template = event.bracketTemplateId ? getBracketTemplate(event.bracketTemplateId) : null; if (!template) { return { error: "Bracket template not found" }; @@ -712,20 +714,7 @@ export async function action({ request, params }: Route.ActionArgs) { matches.flatMap((m) => [m.participant1Id, m.participant2Id].filter(Boolean)) ); - // Process all rounds in order const db = database(); - for (const round of template.rounds) { - const roundMatches = matches.filter((m) => m.round === round.name); - if (roundMatches.length === 0) continue; - - // Set playoffRound and process this round - await db - .update(schema.scoringEvents) - .set({ playoffRound: round.name, updatedAt: new Date() }) - .where(eq(schema.scoringEvents.id, params.eventId)); - - await processPlayoffEvent(params.eventId, db); - } // Assign 0 points to participants not in the bracket (Q20) for (const participant of allParticipants) {