public async Task <ILoadedReport> LoadAsync(Guid competitionId, OptionalReportColumns optionalColumns) { var book = new ReportBook(); using (var context = contextFactory()) { var competition = await context.Competitions.FirstOrDefaultAsync(c => c.Id == competitionId); if (competition == null) { throw new CompetitionNotFoundException(); } book.DocumentName = string.Format(Resources.FillInTitle, competition.Name); foreach (var distance in await context.Distances.Where(d => d.CompetitionId == competitionId).OrderBy(d => d.Number).ToListAsync()) { var calculator = calculatorManager.Get(distance.Discipline); var length = calculator.Length(distance); var report = await DrawFillInReportLoader.LoadAsync(context, competitionId, distance.Id, length, optionalColumns); var drawReport = report as IPairsDrawReport; if (drawReport?.Pairs.Count() == 0) { continue; } book.Reports.Add(report); } } return(new TelerikLoadedReport(book)); }
public async Task <ILoadedReport> LoadAsync(Guid competitionId, Guid distanceId, OptionalReportColumns optionalColumns) { using (var context = contextFactory()) { var distance = await context.Distances.FirstOrDefaultAsync(d => d.CompetitionId == competitionId && d.Id == distanceId); if (distance == null) { return(null); } var calculator = calculatorManager.Get(distance.Discipline); var length = calculator.Length(distance); var report = await LoadAsync(context, competitionId, distanceId, length, optionalColumns); return(new TelerikLoadedReport(report)); } }
private XElement XDistances(Competition competition, IList <PersonCompetitor> competitors) { /* <distances> * <distance id="1"> * <length>1000</length> * <description>1000 meter</description> * <date>2015-03-29</date> * <icerinkref id="DH"/> * <timeinfo source="electronic" precision="2"/> * <races> * <race nr="1" track="inner"> * <competitorref id="44"/> * <finaltime value="112200" points="56100"/> * </race> * ... */ return(new XElement("distances", from d in competition.Distances where d.Discipline.StartsWith("SpeedSkating.LongTrack.PairsDistance") orderby d.Number let calculator = calculatorManager.Get(d.Discipline) let precision = calculator.DefaultResultPrecision ?? TimeSpan.Zero let precisionDigits = precision == TimeSpan.FromTicks(10) ? 2 : 3 select new XElement("distance", new XAttribute("id", d.Number), new XElement("length", calculator.Length(d)), new XElement("description", d.Name), new XElement("date", (d.Starts ?? competition.Starts).ToString("yyyy-MM-dd")), new XElement("icerinkref", new XAttribute("id", competition.VenueCode ?? "")), new XElement("timeinfo", new XAttribute("source", "electronic"), new XAttribute("precision", precisionDigits)), new XElement("races", from r in d.Races where r.PresentedResult != null && r.PresentedResult.Status == RaceStatus.Done orderby r.Round, r.Heat, r.Lane let competitorId = competitors.IndexOf(r.Competitor as PersonCompetitor) where competitorId > -1 select new XElement("race", new XAttribute("nr", r.Heat), new XAttribute("track", XTrack((Lane)r.Lane)), new XElement("competitorref", new XAttribute("id", competitorId + 1)), XFinalTime(r, precision), XRaceAttributes(r)))))); }
public void ActivateHeat(Heat heat, IEnumerable <TRace> races) { var heatState = new HeatState <TRace, TRacePassing, TRaceLap>(Distance, heat, races, calculatorManager.Get(Distance.Discipline)); heatState.Activate(); activeHeats[heat] = heatState; }
private async Task ExportDistancesAsync(Competition competition, TextWriter writer, CultureInfo culture, ICompetitionContext context) { var distances = await context.Distances .Include(d => d.Races.Select(r => r.Competitor)) .Include(d => d.Races.Select(r => r.Transponders.Select(t => t.Transponder))) .Where(d => d.CompetitionId == competition.Id) .ToListAsync(); var groups = new XElement("groups"); foreach (var distance in distances.OrderBy(dc => dc.Number)) { var calculator = distanceCalculatorManager.Get(distance.Discipline); var group = new XElement("group", new XAttribute("name", $"{distance.Number:00}. {distance.Name}"), new XElement("competitors", from r in distance.Races let personCompetitor = r.Competitor as PersonCompetitor where personCompetitor != null orderby personCompetitor.StartNumber select new XElement("competitor", new XAttribute("no", personCompetitor.StartNumber), new XAttribute("driverregistration", personCompetitor.LicenseKey), new XAttribute("registration", personCompetitor.LicenseKey), new XAttribute("class", personCompetitor.Category), new XAttribute("firstname", personCompetitor.Name.FirstName ?? ""), new XAttribute("lastname", personCompetitor.Name.PrefixedSurname ?? ""), new XAttribute("transponders", string.Join(",", r.Transponders.Select(t => t.Transponder.Label))), new XAttribute("additional1", personCompetitor.NationalityCode), new XAttribute("additional2", personCompetitor.Sponsor ?? ""), new XAttribute("additional3", personCompetitor.ShortName), new XAttribute("additional4", personCompetitor.From ?? ""), new XAttribute("additional5", personCompetitor.ClubFullName ?? "")))); var starts = InTimeZone(distance.Starts ?? competition.Starts, competition.TimeZone); var runs = new XElement("runs"); foreach (var heat in distance.Races.GroupBy(r => new { r.Round, r.Heat }).OrderBy(g => g.Key.Round).ThenBy(g => g.Key.Heat)) { var minimumLapTime = calculator.MininumLapTime(distance); var run = new XElement("run", new XAttribute("name", $"{heat.Key.Round:00}.{heat.Key.Heat:000}"), new XAttribute("shortname", $"{heat.Key.Round:00}.{heat.Key.Heat:000}"), new XAttribute("date", starts.ToString("yyyy-MM-dd")), new XAttribute("time", starts.ToString("HH:mm:ss")), new XAttribute("type", "race"), new XAttribute("countfirst", "lap"), new XAttribute("minimumlaptime", minimumLapTime.ToString(@"h\:mm\:ss\.fff")), new XAttribute("copygroupcompetitor", true), new XElement("competitors", from r in heat let personCompetitor = r.Competitor as PersonCompetitor where personCompetitor != null orderby r.Lane select new XElement("competitor", new XAttribute("no", personCompetitor.StartNumber), new XAttribute("driverregistration", personCompetitor.LicenseKey), new XAttribute("registration", personCompetitor.LicenseKey), new XAttribute("class", personCompetitor.Category), new XAttribute("firstname", personCompetitor.Name.FirstName ?? ""), new XAttribute("lastname", personCompetitor.Name.PrefixedSurname ?? ""), new XAttribute("transponders", string.Join(",", r.Transponders.Select(t => t.Transponder.Label))), new XAttribute("additional1", personCompetitor.NationalityCode), new XAttribute("additional2", personCompetitor.Sponsor ?? ""), new XAttribute("additional3", personCompetitor.ShortName), new XAttribute("additional4", personCompetitor.From ?? ""), new XAttribute("additional5", personCompetitor.ClubFullName ?? "")))); switch (calculator.HeatStartEvent) { case HeatStartEvent.Start: run.Add(new XAttribute("startmethod", "flag")); break; case HeatStartEvent.FirstPassing: run.Add(new XAttribute("startmethod", "firstpassing")); break; } switch (distance.ValueQuantity) { case DistanceValueQuantity.Length: case DistanceValueQuantity.Count: run.Add(new XAttribute("autofinishmethod", "individualonlaps")); run.Add(new XAttribute("autofinishlaps", calculator.Laps(distance))); break; } runs.Add(run); } group.Add(runs); groups.Add(group); } var document = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), groups); document.Save(writer); }
private string GetDistanceFileName(IDistance distance, char type) { var calculator = calculatorManager.Get(distance.Discipline); return(string.Format(DistanceFileName, type, calculator.Length(distance), distance.Number)); }