diff --git a/app/routes/admin.sports-seasons.$id.simulate.tsx b/app/routes/admin.sports-seasons.$id.simulate.tsx index 6a37a2e..e44c965 100644 --- a/app/routes/admin.sports-seasons.$id.simulate.tsx +++ b/app/routes/admin.sports-seasons.$id.simulate.tsx @@ -17,7 +17,10 @@ import { batchUpsertParticipantEvSnapshots } from "~/models/ev-snapshot"; import { findParticipantsBySportsSeasonId } from "~/models/participant"; import { getSimulator, type SimulatorType } from "~/services/simulations/registry"; import { calculateEV, type ScoringRules } from "~/services/ev-calculator"; -import { recalculateAffectedLeagues } from "~/models/scoring-calculator"; +import { recalculateStandings } from "~/models/scoring-calculator"; +import { database } from "~/database/context"; +import * as schema from "~/database/schema"; +import { eq } from "drizzle-orm"; // Default scoring rules — matches the season table defaults. // Per-league EV is recalculated from probabilities using league-specific rules in standings. @@ -100,8 +103,14 @@ export async function action({ params }: Route.ActionArgs) { // Persist updated EVs (transactional) await batchUpsertParticipantEVs(evInputs); - // Force standings recalculation so projectedPoints reflects the new EV - await recalculateAffectedLeagues(sportsSeasonId); + // Refresh cached projectedPoints in teamStandings for all affected fantasy seasons + const db = database(); + const seasonSports = await db.query.seasonSports.findMany({ + where: eq(schema.seasonSports.sportsSeasonId, sportsSeasonId), + }); + for (const { seasonId } of seasonSports) { + await recalculateStandings(seasonId, db); + } // Take EV snapshot from simulation output (not re-read from DB) const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD