/// <summary> /// Save the Team Trophy current event table. /// </summary> /// <param name="model">junior handicap model</param> /// <param name="folderPath">path of the folder to save the table to</param> /// <param name="logger">application logger</param> /// <returns>success flag</returns> private static bool WriteCurrentEventTable( IModel model, string folderPath, IJHcLogger logger) { bool success = true; try { string outPath = $"{folderPath}{ResultsPaths.teamTrophyPointsTableCurrentEvent}{ResultsPaths.csvExtension}"; using ( StreamWriter writer = new StreamWriter( outPath)) { string titleString = "Club" + ResultsPaths.separator + "Score" + ResultsPaths.separator + "Points"; writer.WriteLine(titleString); foreach (ClubSeasonDetails club in model.CurrentSeason.Clubs) { if (club.MobTrophy.TotalPoints > 0) { ITeamTrophyEvent foundEvent = club.TeamTrophy.Events.Find( e => e.Date == model.CurrentEvent.Date); if (foundEvent == null) { continue; } string entryString = $"{club.Name}{ResultsPaths.separator}{foundEvent.Score}{ResultsPaths.separator}{foundEvent.TotalAthletePoints}"; foreach (ICommonTeamTrophyPoints commonPoints in foundEvent.Points) { entryString = entryString + ResultsPaths.separator + commonPoints.Point; } writer.WriteLine(entryString); } } } } catch (Exception ex) { logger.WriteLog("Error, failed to print club points table: " + ex.ToString()); Messenger.Default.Send( new HandicapErrorMessage( "Failed to print club points table")); success = false; } return(success); }
/// <summary> /// Write the next runner to a file. /// </summary> /// <param name="model">junior handicap model</param> /// <param name="folder">output model</param> /// <param name="seriesConfigMngr">series configuraton manager</param> /// <param name="logger">application logger</param> /// <returns>success flag</returns> public static bool WriteNextRunnerTable( IModel model, string folder, ISeriesConfigMngr seriesConfigMngr, IJHcLogger logger) { bool success = true; Messenger.Default.Send( new HandicapProgressMessage( "Printing next runner.")); SeriesConfigType config = seriesConfigMngr.ReadSeriesConfiguration(); try { using (StreamWriter writer = new StreamWriter(Path.GetFullPath(folder) + Path.DirectorySeparatorChar + model.CurrentSeason.Name + model.CurrentEvent.Name + ResultsPaths.nextNewRunner + ResultsPaths.csvExtension)) { writer.WriteLine(config?.NumberPrefix + model.Athletes.NextAvailableRaceNumber.ToString("000000")); } } catch (Exception ex) { logger.WriteLog("Error, failed to print next runner: " + ex.ToString()); Messenger.Default.Send( new HandicapErrorMessage( "Failed to print next runner")); success = false; } return(success); }
/// <summary> /// Write the results to a comma separated file /// </summary> /// <param name="model">junior handicap model</param> /// <param name="folder">folder to save the file to</param> /// <param name="logger">application logger</param> /// <returns>success flag</returns> public static bool SavePointsTable( IModel model, string folder, IJHcLogger logger) { bool success = false; Messenger.Default.Send( new HandicapProgressMessage( "Saving results.")); try { using (StreamWriter writer = new StreamWriter(Path.GetFullPath(folder) + Path.DirectorySeparatorChar + model.CurrentSeason.Name + model.CurrentEvent.Name + ResultsPaths.pointsTable + ResultsPaths.csvExtension)) { foreach (AthleteSeasonDetails athlete in model.CurrentSeason.Athletes) { if (athlete.Points.TotalPoints > 0) { double averagePoints = 0; if (athlete.NumberOfAppearances > 0) { averagePoints = (double)athlete.Points.TotalPoints / (double)athlete.NumberOfAppearances; } string entryString = athlete.Name + ResultsPaths.separator + athlete.Points.TotalPoints.ToString() + ResultsPaths.separator + model.Athletes.GetPB(athlete.Key).ToString() + ResultsPaths.separator + athlete.SB.ToString() + ResultsPaths.separator + athlete.NumberOfAppearances.ToString() + ResultsPaths.separator + averagePoints.ToString("0.##"); writer.WriteLine(entryString); } } success = true; } } catch (Exception ex) { logger.WriteLog("Error, failed to print points table: " + ex.ToString()); Messenger.Default.Send( new HandicapErrorMessage( "Failed to print points table")); success = false; } return(success); }
/// <summary> /// Write the handicaps to a file. /// </summary> /// <param name="model">junior handicap model</param> /// <param name="folder">output folder</param> /// <param name="normalisationConfigMngr">normalisation configuration manager</param> /// <param name="logger">application logger</param> /// <returns>success flag</returns> public static bool WriteHandicapTable( IModel model, string folder, INormalisationConfigMngr normalisationConfigMngr, IJHcLogger logger) { bool success = true; Messenger.Default.Send( new HandicapProgressMessage( "Printing handicap.")); try { NormalisationConfigType hcConfiguration = normalisationConfigMngr.ReadNormalisationConfiguration(); using (StreamWriter writer = new StreamWriter(Path.GetFullPath(folder) + Path.DirectorySeparatorChar + model.CurrentSeason.Name + model.CurrentEvent.Name + ResultsPaths.handicapTable + ResultsPaths.csvExtension)) { List <AthleteDetails> athletes = new List <AthleteDetails>(model.Athletes.AthleteDetails); athletes = athletes.OrderBy(athlete => athlete.Forename).ToList(); athletes = athletes.OrderBy(athlete => athlete.Surname).ToList(); foreach (AthleteDetails athlete in athletes) { if (!athlete.Active) { continue; } string number = model.Athletes.GetAthleteRunningNumber( athlete.Key); TimeType newHandicap = model.CurrentSeason.GetAthleteHandicap( athlete.Key, hcConfiguration); string consented = athlete.SignedConsent ? "Y" : string.Empty; // Use default handicap, if the athlete is not registered for the current season. if (newHandicap == null) { newHandicap = athlete.RoundedHandicap; } string entryString = athlete.Name + ResultsPaths.separator + number + ResultsPaths.separator + newHandicap + ResultsPaths.separator + athlete.Club + ResultsPaths.separator + consented; writer.WriteLine(entryString); } success = true; } } catch (Exception ex) { logger.WriteLog("Error, failed to print handicap: " + ex.ToString()); Messenger.Default.Send( new HandicapErrorMessage( "Failed to print handicap")); success = false; } return(success); }
/// <summary> /// Write the summary to a file. /// </summary> /// <param name="model">junior handicap model</param> /// <param name="folder">output folder</param> /// <param name="logger">application logger</param> /// <returns>success folder</returns> public static bool WriteEventSummaryTable( IModel model, string folder, IJHcLogger logger) { bool success = true; Messenger.Default.Send( new HandicapProgressMessage( "Printing event summary")); try { using (StreamWriter writer = new StreamWriter(Path.GetFullPath(folder) + Path.DirectorySeparatorChar + model.CurrentSeason.Name + model.CurrentEvent.Name + ResultsPaths.summaryTable + ResultsPaths.csvExtension)) { writer.WriteLine(model.CurrentEvent.Name + ResultsPaths.separator + model.CurrentEvent.Date); writer.WriteLine(); writer.WriteLine("Number Of Runners" + ResultsPaths.separator + model.CurrentEvent.Summary.Runners); writer.WriteLine("Number Of Girls" + ResultsPaths.separator + model.CurrentEvent.Summary.FemaleRunners); writer.WriteLine("Number Of Boys" + ResultsPaths.separator + model.CurrentEvent.Summary.MaleRunners); writer.WriteLine("Number Of Personal Bests" + ResultsPaths.separator + model.CurrentEvent.Summary.PBs); writer.WriteLine("Number Of Season Bests" + ResultsPaths.separator + model.CurrentEvent.Summary.SBs); writer.WriteLine("Number Of First Timers" + ResultsPaths.separator + model.CurrentEvent.Summary.FirstTimers); writer.WriteLine("Fastest Girl" + ResultsPaths.separator + model.CurrentEvent.Summary.FastestGirl + ResultsPaths.separator + model.CurrentEvent.Summary.FastestGirlTime); writer.WriteLine("Fastest Boy" + ResultsPaths.separator + model.CurrentEvent.Summary.FastestBoy + ResultsPaths.separator + model.CurrentEvent.Summary.FastestBoyTime); } } catch (Exception ex) { logger.WriteLog("Error, failed to print event summary: " + ex.ToString()); Messenger.Default.Send( new HandicapErrorMessage( "Failed to print event summary")); success = false; } return(success); }
/// <summary> /// Save the Team Trophy to the file. /// </summary> /// <param name="model">junior handicap model</param> /// <param name="folderPath">path of the folder to save the table to</param> /// <param name="eventData">event data wrapper</param> /// <param name="logger">application logger</param> /// <returns>success flag</returns> private static bool WriteOverallSeasonTable( IModel model, string folderPath, IEventData eventData, IJHcLogger logger) { bool success = true; List <DateType> eventDates = new List <DateType>(); try { string outPath = $"{folderPath}{ResultsPaths.teamTrophyPointsTable}{ResultsPaths.csvExtension}"; using ( StreamWriter writer = new StreamWriter( outPath)) { string titleString = "Club" + ResultsPaths.separator + "TotalPoints"; foreach (string eventName in model.CurrentSeason.Events) { titleString = titleString + ResultsPaths.separator + eventName; eventDates.Add(eventData.LoadEventData(model.CurrentSeason.Name, eventName).EventDate); } writer.WriteLine(titleString); foreach (ClubSeasonDetails club in model.CurrentSeason.Clubs) { int totalScore = TeamTrophyTableWriter.CalculateTotalScore( club.TeamTrophy.Events); if (totalScore > 0) { string entryString = $"{club.Name}{ResultsPaths.separator}{totalScore}"; foreach (DateType eventDate in eventDates) { if (club.MobTrophy.Points.Exists(points => points.Date == eventDate)) { ITeamTrophyEvent foundEvent = club.TeamTrophy.Events.Find( points => points.Date == eventDate); int eventPoints = foundEvent != null ? foundEvent.Score : 0; entryString = entryString + ResultsPaths.separator + eventPoints; } else { entryString += ResultsPaths.separator; } } writer.WriteLine(entryString); } } } } catch (Exception ex) { logger.WriteLog("Error, failed to print club points table: " + ex.ToString()); Messenger.Default.Send( new HandicapErrorMessage( "Failed to print club points table")); success = false; } return(success); }
/// <summary> /// Write the results to a comma separated file /// </summary> /// <param name="model">junior handicap model</param> /// <param name="folder">folder to save the file to</param> /// <param name="logger">application logger</param> /// <returns>success flag</returns> public static bool WriteResultsTable( IModel model, string folder, IJHcLogger logger) { bool success = false; Messenger.Default.Send( new HandicapProgressMessage( "Printing results.")); try { using (StreamWriter writer = new StreamWriter(Path.GetFullPath(folder) + Path.DirectorySeparatorChar + model.CurrentSeason.Name + model.CurrentEvent.Name + ResultsPaths.resultsTable + ResultsPaths.csvExtension)) { foreach (ResultsTableEntry entry in model.CurrentEvent.ResultsTable.Entries) { string pbString = entry.PB ? "Y" : string.Empty; string sbString = entry.SB ? "Y" : string.Empty; string entryString = entry.Name + ResultsPaths.separator + entry.Time + ResultsPaths.separator + entry.RunningTime + ResultsPaths.separator + entry.Handicap + ResultsPaths.separator + entry.RunningOrder.ToString() + ResultsPaths.separator + pbString + ResultsPaths.separator + sbString + ResultsPaths.separator + entry.Points.TotalPoints + ResultsPaths.separator + entry.HarmonyPoints + ResultsPaths.separator + entry.Notes + ResultsPaths.separator + entry.RaceNumber + ResultsPaths.separator + entry.Club; writer.WriteLine(entryString); } success = true; } } catch (Exception ex) { logger.WriteLog("Error, failed to print results: " + ex.ToString()); Messenger.Default.Send( new HandicapErrorMessage( "Failed to print results")); success = false; } return(success); }
/// <summary> /// Write the club points (harmony) table to a file /// </summary> /// <param name="model">junior handicap model</param> /// <param name="folder">output folder</param> /// <param name="eventData">event data wrapper</param> /// <param name="logger">application logger</param> /// <returns>success flag</returns> public static bool Write( IModel model, string folder, IEventData eventData, IJHcLogger logger) { bool success = true; List <DateType> eventDates = new List <DateType>(); Messenger.Default.Send( new HandicapProgressMessage( "Saving club points (harmony) table")); try { using (StreamWriter writer = new StreamWriter( Path.GetFullPath(folder) + Path.DirectorySeparatorChar + model.CurrentSeason.Name + model.CurrentEvent.Name + ResultsPaths.clubHarmonyTable + ResultsPaths.csvExtension)) { string titleString = "Club" + ResultsPaths.separator + "TotalPoints"; foreach (string eventName in model.CurrentSeason.Events) { titleString = titleString + ResultsPaths.separator + eventName; eventDates.Add(eventData.LoadEventData(model.CurrentSeason.Name, eventName).EventDate); } writer.WriteLine(titleString); foreach (ClubSeasonDetails club in model.CurrentSeason.Clubs) { if (club.ClubCompetition.TotalPoints > 0) { string entryString = $"{club.Name}{ResultsPaths.separator}{club.HarmonyCompetition.TotalScore}"; foreach (DateType eventDate in eventDates) { if (club.ClubCompetition.Points.Exists(points => points.Date == eventDate)) { int eventPoints = club.HarmonyCompetition.Events.Find(points => points.Date == eventDate).TotalAthletePoints; entryString = entryString + ResultsPaths.separator + eventPoints; } else { entryString += ResultsPaths.separator; } } writer.WriteLine(entryString); } } success = true; } } catch (Exception ex) { logger.WriteLog("Error, failed to print club points table: " + ex.ToString()); Messenger.Default.Send( new HandicapErrorMessage( "Failed to print club points table")); success = false; } return(success); }
/// <summary> /// Write the Mob Trophy points table to a file /// </summary> /// <param name="model">junior handicap model</param> /// <param name="folder">output folder</param> /// <param name="eventData">event data wrapper</param> /// <param name="logger">application logger</param> /// <returns>success flag</returns> public static bool WriteMobTrophyPointsTable( IModel model, string folder, IEventData eventData, IJHcLogger logger) { bool success = true; List <DateType> eventDates = new List <DateType>(); Messenger.Default.Send( new HandicapProgressMessage( "Saving Mob Trophy points table")); // Export the overall season table. try { string outPath = Path.GetFullPath(folder) + Path.DirectorySeparatorChar + model.CurrentSeason.Name + model.CurrentEvent.Name + ResultsPaths.mobTrophyPointsTable + ResultsPaths.csvExtension; using (StreamWriter writer = new StreamWriter(outPath)) { string titleString = "Club" + ResultsPaths.separator + "TotalPoints"; foreach (string eventName in model.CurrentSeason.Events) { titleString = titleString + ResultsPaths.separator + eventName; eventDates.Add(eventData.LoadEventData(model.CurrentSeason.Name, eventName).EventDate); } writer.WriteLine(titleString); foreach (ClubSeasonDetails club in model.CurrentSeason.Clubs) { if (club.MobTrophy.TotalPoints > 0) { string entryString = $"{club.Name}{ResultsPaths.separator}{club.MobTrophy.TotalPoints}"; foreach (DateType eventDate in eventDates) { if (club.MobTrophy.Points.Exists(points => points.Date == eventDate)) { int eventPoints = club.MobTrophy.Points.Find(points => points.Date == eventDate).TotalPoints; entryString = entryString + ResultsPaths.separator + eventPoints; } else { entryString = entryString + ResultsPaths.separator; } } writer.WriteLine(entryString); } } } } catch (Exception ex) { logger.WriteLog("Error, failed to print mob trophy points table: " + ex.ToString()); Messenger.Default.Send( new HandicapErrorMessage( "Failed to print mob trophy points table")); success = false; } // Export the table for the current event. try { using ( StreamWriter writer = new StreamWriter( Path.GetFullPath(folder) + Path.DirectorySeparatorChar + model.CurrentSeason.Name + model.CurrentEvent.Name + ResultsPaths.mobTrophyPointsTableCurrentEvent + ResultsPaths.csvExtension)) { string titleString = "Club" + ResultsPaths.separator + "Total Points" + ResultsPaths.separator + "Finishing Points" + ResultsPaths.separator + "Position Points" + ResultsPaths.separator + "Season Best Points"; writer.WriteLine(titleString); foreach (ClubSeasonDetails club in model.CurrentSeason.Clubs) { if (club.MobTrophy.TotalPoints > 0) { ICommonPoints currentEventPoints = club.MobTrophy.Points.Find( e => e.Date == model.CurrentEvent.Date); if (currentEventPoints == null) { continue; } string entryString = club.Name + ResultsPaths.separator + currentEventPoints.TotalPoints + ResultsPaths.separator + currentEventPoints.FinishingPoints + ResultsPaths.separator + currentEventPoints.PositionPoints + ResultsPaths.separator + currentEventPoints.BestPoints; writer.WriteLine(entryString); } } } } catch (Exception ex) { logger.WriteLog("Error, failed to print mob trophy points table: " + ex.ToString()); Messenger.Default.Send( new HandicapErrorMessage( "Failed to print mob trophy points table")); success = false; } return(success); }
/// <summary> /// Import the times from <paramref name="fileName"/> /// </summary> /// <param name="fileName">file containing times</param> /// <param name="commonIo">common Io manager</param> /// <param name="logger">program logger</param> /// <returns>collection of race times.</returns> public static List <RawPositionResults> Import( string fileName, ICommonIo commonIo, IJHcLogger logger) { List <RawPositionResults> rawImportedPositions = new List <RawPositionResults>(); List <List <string> > rawPositions = commonIo.ReadPairedStringListFomFile(fileName); foreach (List <string> positionAthleteData in rawPositions) { // Ensure 2 results present if (positionAthleteData.Count == 2) { int? position = null; string raceNumber = null; string result1 = ResultsDecoder.OpnScannerResultsBarcode(positionAthleteData[0]); string result2 = ResultsDecoder.OpnScannerResultsBarcode(positionAthleteData[1]); UpdatePositionAthleteData( result1, ref position, ref raceNumber); UpdatePositionAthleteData( result2, ref position, ref raceNumber); if (position != null && raceNumber != null) { RawPositionResults results = new RawPositionResults( raceNumber, (int)position); rawImportedPositions.Add(results); } else { string errorString = $"Can't decode {positionAthleteData[0]}/{positionAthleteData[1]}"; HandicapProgressMessage message = new HandicapProgressMessage( errorString); Messenger.Default.Send( new HandicapProgressMessage( errorString)); logger.WriteLog(errorString); } } else { string errorString = "Please check results, result/barcode pair invalid"; Messenger.Default.Send( new HandicapProgressMessage( errorString)); logger.WriteLog(errorString); } } rawImportedPositions = rawImportedPositions .OrderBy(position => position.Position) .ToList(); return(rawImportedPositions); }