diff --git a/app/models/scoring-calculator.ts b/app/models/scoring-calculator.ts index e813e30..2742167 100644 --- a/app/models/scoring-calculator.ts +++ b/app/models/scoring-calculator.ts @@ -1357,6 +1357,17 @@ export async function recalculateAffectedLeagues( const teamIdByParticipantId = new Map( draftPicks.map((p) => [p.participantId, p.teamId]) ); + + // Teams whose score actually changed after recalculation. + const changedTeamIds = new Set( + afterStandings + .filter((s) => { + const prev = previousPointsById.get(s.teamId); + return prev === undefined || prev !== parseFloat(s.totalPoints); + }) + .map((s) => s.teamId) + ); + const usernameForParticipant = (participantId: string | null | undefined) => { if (!participantId) return undefined; const teamId = teamIdByParticipantId.get(participantId); @@ -1366,12 +1377,25 @@ export async function recalculateAffectedLeagues( return usernameByClerkId.get(ownerId); }; + // Only set winnerUsername if the winner's owner actually scored points + // this round. This prevents listing matches where a drafted team won + // but the scoring system didn't award points yet (e.g. R64 wins when + // points only trigger at Sweet 16+). + const winnerUsernameForParticipant = (participantId: string | null | undefined) => { + if (!participantId) return undefined; + const teamId = teamIdByParticipantId.get(participantId); + if (!teamId || !changedTeamIds.has(teamId)) return undefined; + const ownerId = ownerIdByTeamId.get(teamId); + if (!ownerId) return undefined; + return usernameByClerkId.get(ownerId); + }; + scoredMatches = relevant .filter((m) => m.winnerName && m.loserName) .map((m) => ({ winnerName: m.winnerName!, loserName: m.loserName!, - winnerUsername: usernameForParticipant(m.winnerId), + winnerUsername: winnerUsernameForParticipant(m.winnerId), loserUsername: usernameForParticipant(m.loserId), })); }