/// <summary> /// Sets the race status. /// </summary> /// <param name="race">The race.</param> public void SetRaceStatus(UserControls.Race race) { // Rennen ist zunächst mal OK race.Status = UserControls.RaceStatus.Ok; // außer... : // Reihenfolge beachten! if (race?.Boats?.Any(b => b.Status == UserControls.BoatStatus.WaitingForTimeWindow) == true) { // Es gibt noch Ruderer ohne Gewicht, bei denen ist es noch nicht Zeit zum wiegen race.Status = UserControls.RaceStatus.WaitingForTimeWindow; } else if (race?.Boats?.Any(b => b.Status == UserControls.BoatStatus.WaitingInsideTimeWindow) == true) { // Es gibt noch Ruderer ohne Gewicht, die könnten jetzt aber bereits zum Wiegen erscheinen race.Status = UserControls.RaceStatus.WaitingInsideTimeWindow; } else if (race?.Boats?.Any(b => b.Status == UserControls.BoatStatus.BoatNok) == true) { // Alle waren zum Wiegen da, aber es gibt ein Boot, das nicht OK ist race.Status = UserControls.RaceStatus.OkWithProblems; } }
/// <summary> /// Sets the boat status. /// </summary> /// <param name="boat">The boat.</param> public void SetBoatStatus(RaceData raceData, BoatData boatData, UserControls.Race race, UserControls.Boat boat) { if (boatData.Canceled) { // Boot ist abgemeldet boat.Comment = "Boot abgemeldet!"; boat.Status = UserControls.BoatStatus.BoatOk; boat.Canceled = true; // Wenn das Boot abgemeldet ist, dann ist es egal, ob die einzelnen Ruderer darin zum Wiegen da waren oder nicht. // Diese Ruderer sollen dann nicht als zu schwer oder fehlend angezeigt werden, sondern als in Ordnung. var rowsers = boat.Rowers.Where(r => new[] { UserControls.RowerStatus.TooLate, UserControls.RowerStatus.WeightNotOk }.Contains(r.Status)); foreach (var rower in rowsers) { rower.Status = UserControls.RowerStatus.WaitingForTimeWindow; } return; } // Im UserControl ("boat") sind Ruderer und Steuermann in einer gemeinsamen Liste enthalten // und lassen sich nur durch das Type-Attribut des jeweiligen Eintrags unterscheiden var rowersWithoutCox = boat.Rowers.Where(r => r.Type == UserControls.RowerType.Rower); // Prüfen ob das Boot vollständig besetzt ist if (raceData.NumberOfRowers != rowersWithoutCox.Count()) { boat.Comment = "Anzahl der Ruderer passt nicht zur Bootsklasse!"; boat.Status = UserControls.BoatStatus.BoatNok; return; } // Prüfen ob der Steuermann da ist if (raceData.IsCoxedRace && (boat.Rowers.Count(r => r.Type == UserControls.RowerType.Cox) != 1)) { boat.Comment = "Steuermann fehlt!"; boat.Status = UserControls.BoatStatus.BoatNok; return; } // Durchschnittsgewicht wird berechnet, wenn es mehr als einen Ruderer gibt und // wenn mindestens schon von einem Ruderer das Gewicht vorliegt. var calculateAverageWeight = (rowersWithoutCox.Count() > 1) && (rowersWithoutCox?.Any(r => r.WeightInfo != null) == true); // Durchschnittsgewicht wird auf Richtigkeit geprüft, wenn ein Sollwert vorhanden ist var checkAverageWeightOk = calculateAverageWeight && (raceData.MaxAverageWeight?.Value != null) && (raceData.MaxAverageWeight.Value > 0); float averageWeight = 0; boat.AverageWeight = ""; if (checkAverageWeightOk) { // Durschnittsgewicht berechnen var count = 0; foreach (var rower in rowersWithoutCox) { if (rower.WeightInfo != null) { averageWeight += (float)rower.WeightInfo; count++; } } if (count == 0) { averageWeight = 0; } else { averageWeight = averageWeight / count; boat.AverageWeight = $"(ø {averageWeight} kg)"; } if (checkAverageWeightOk) { } } // Reihenfolge beachten! if (boat?.Rowers?.Any(r => r.Status == UserControls.RowerStatus.WeightNotOk) == true) { // es gibt Ruderer, bei denen das Gewicht nicht passt boat.Status = UserControls.BoatStatus.BoatNok; } else if (boat?.Rowers?.Any(r => r.Status == UserControls.RowerStatus.TooLate) == true) { // Es gibt Ruderer, die das Wiegen verpasst haben boat.Status = UserControls.BoatStatus.BoatNok; } else if (boat?.Rowers?.Any(r => r.Status == UserControls.RowerStatus.WaitingForTimeWindow) == true) { // Es gibt Ruderer ohne Gewicht, für die es noch zu früh zum Wiegen ist boat.Status = UserControls.BoatStatus.WaitingForTimeWindow; } else if (boat?.Rowers?.Any(r => r.Status == UserControls.RowerStatus.WaitingInsideTimeWindow) == true) { // Es gibt Ruderer ohne Gewicht, die jetzt zum wiegen dran wären boat.Status = UserControls.BoatStatus.WaitingInsideTimeWindow; } else if (boat.Rowers.All(r => r.Status == UserControls.RowerStatus.WeightOk)) { // alle Ruderer sind einzeln OK, jetzt muss noch das Durschnittsgewicht stimmen if (checkAverageWeightOk) { boat.Status = (averageWeight <= raceData.MaxAverageWeight.Value) ? UserControls.BoatStatus.BoatOk : UserControls.BoatStatus.BoatNok; } else { // Durschnittsgewicht interessiert nicht boat.Status = UserControls.BoatStatus.BoatOk; } } // Zusatzgewicht bestimmen var cox = boat.Rowers.SingleOrDefault(r => r.Type == UserControls.RowerType.Cox); if (cox != null) { // es gibt einen Steuermann if (cox.WeightInfo != null) { // es gibt ein Gewicht für den Steuermann if (raceData.MinCoxWeight.IsSpecified()) { // Sollgewicht für Steuermann vorhanden var weight = (float)cox.WeightInfo; var additionalWeight = raceData.MinCoxWeight.Value - weight; if (additionalWeight > 0) { // Steuermann ist zu leicht boat.Comment = $"Zusatzgewicht für Steuermann! => {additionalWeight:0.0} kg"; } } } } }