public void AddHeat(int HeatSheetEventID) { Heat heat = new Heat(); heat.HeatNumber = 0; heat.HeatSheetEventID = HeatSheetEventID; Ctx.HeatManager.HeatSave(heat); }
public void SeedHeatSheetEvent(int HeatSheetEventID, List<int> SwimmerTeamSeasonIDs) { //Get Stroke to determine whether it's a relay or not Stroke stroke = Ctx.StrokeManager.StrokeGetByHeatSheetEventID(HeatSheetEventID); bool IsRelay = stroke.IsRelay; //Get dictionary of swimmers grouped by teamSeasonID(Key), swimmer list is sorted by lowest (fastest) seed time first, except swimmers with O seed time are last Dictionary<int, List<Result>> teamResults = new Dictionary<int, List<Result>>(); HeatSheetTeamCollection heatSheetTeams = Ctx.HeatSheetTeamManager.HeatSheetTeamGetAllByHeatSheetEventID(HeatSheetEventID); //TODO: Determine How to persist the SeedTimeType (HeatSheetTeam? SwimMeetTeam?) default to most recent for now SwimomaticBusinessManager.SeedTimeType seedTimeType = SwimomaticBusinessManager.SeedTimeType.MostRecent; if (heatSheetTeams.Count > 0) { teamResults = GetTeamResults(HeatSheetEventID, SwimmerTeamSeasonIDs, seedTimeType); } else { //if there are no HeatSheetTeams, there was a problem creating the heat sheet throw new Exception("No Teams have been assigned to the Heat Sheet"); } //Get dictionary of currently Available Lanes grouped by teamID(Key), for any existing heats Dictionary<int, List<AvailableLane>> teamAvailableLanes = GetTeamAvailableLanes(HeatSheetEventID, heatSheetTeams); //Determine if additional new heats are needed and create them if necessary int heatsNeededForThisTeam = 0; int totalHeatsNeeded = 0; HeatSheetTeam heatSheetTeam = null; if (IsRelay) //If the event is an Individual event, the number of needed heats is calculated differently from a relay { foreach (int TeamSeasonID in teamResults.Keys) { //if the number of realy teams (4 swimmers) for this team exceeds the number of available lanes for this team... if (teamResults[TeamSeasonID].Count / 4 > teamAvailableLanes[TeamSeasonID].Count) { heatSheetTeam = (HeatSheetTeam)heatSheetTeams.Where(h => h.TeamSeasonID == TeamSeasonID).First(); //heats needed for the current team = number of relay teams (4 swimmers) divided by available lanes, + 1 more if there is any remainder heatsNeededForThisTeam = ((teamResults[TeamSeasonID].Count / 4) % heatSheetTeam.LaneList.Count == 0) ? (teamResults[TeamSeasonID].Count / 4) / heatSheetTeam.LaneList.Count : ((teamResults[TeamSeasonID].Count / 4) / heatSheetTeam.LaneList.Count) + 1; } } } else { foreach (int TeamSeasonID in teamResults.Keys) { //if the number of swimmers for this team exceeds the number of available lanes for this team... if (teamResults[TeamSeasonID].Count > teamAvailableLanes[TeamSeasonID].Count) { heatSheetTeam = (HeatSheetTeam)heatSheetTeams.Where(h => h.TeamSeasonID == TeamSeasonID).First(); //heats needed for the current team = number of swimmers divided by available lanes, + 1 more if there is any remainder heatsNeededForThisTeam = (teamResults[TeamSeasonID].Count % heatSheetTeam.LaneList.Count == 0) ? teamResults[TeamSeasonID].Count / heatSheetTeam.LaneList.Count : (teamResults[TeamSeasonID].Count / heatSheetTeam.LaneList.Count) + 1; } } } totalHeatsNeeded = Math.Max(totalHeatsNeeded, heatsNeededForThisTeam); Heat ht; for (int i = 0; i < totalHeatsNeeded; i++) { ht = new Heat(); ht.HeatSheetEventID = HeatSheetEventID; Ctx.HeatManager.HeatSave(ht); } //Finally, assign swimmers to heats //first, refresh Available Lanes now that new heats may have been added teamAvailableLanes = GetTeamAvailableLanes(HeatSheetEventID, heatSheetTeams); List<AvailableLane> availableLanes; int j = 0; if (IsRelay) { int leg = 0; List<int> swimmerTeamSeasonIDs = new List<int>(); List<List<int>> relayTeams = null; foreach (int TeamID in teamResults.Keys) { leg = 0; relayTeams = new List<List<int>>(); foreach (Result r in teamResults[TeamID]) { swimmerTeamSeasonIDs.Add(r.SwimmerTeamSeasonID); leg++; //add 4 swimmers to each swimmerIDs list then add that list to the relayTeams list //if there are less than an even 4 swimmers at the end of the list, they get left off (input validation should require even groups of 4 for seeding relays) //TODO:input validation should require even groups of 4 swimmers for seeding relays if (leg == 4) { relayTeams.Add(swimmerTeamSeasonIDs); swimmerTeamSeasonIDs = new List<int>(); leg = 0; } } availableLanes = teamAvailableLanes[TeamID]; j = 0; foreach (List<int> swmrTSIDs in relayTeams) { leg = 1; foreach (int swimmerTeamSeasonID in swmrTSIDs) { if (availableLanes.Count > j) { AddHeatSwimmer(availableLanes[j].HeatID, swimmerTeamSeasonID, leg, availableLanes[j].LaneNumber); leg++; } } j++; } } } else { foreach (int TeamID in teamResults.Keys) { j = 0; availableLanes = teamAvailableLanes[TeamID]; foreach (Result r in teamResults[TeamID]) { if (availableLanes.Count > j) { AddHeatSwimmer(availableLanes[j].HeatID, r.SwimmerTeamSeasonID, 0, availableLanes[j].LaneNumber); j++; } } } } }
public int SaveHeat(Heat heat) { return Ctx.HeatManager.HeatSave(heat); }