Ejemplo n.º 1
0
        /// <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;
            }
        }
Ejemplo n.º 2
0
        /// <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";
                        }
                    }
                }
            }
        }