Beispiel #1
0
        private int DrawAllPots()
        {
            AddMessage(null, null, "Starte Ziehung");
            // Zuerst nachsehen, ob Wünsche offen sind
            foreach (var game in Games)
            {
                if (game.Seats.Count >= game.CoursesWanted)
                {
                    // alle Lose ungültig machen => hat schon alles
                    foreach (var lot in game.Lots)
                    {
                        lot.IsValid   = false;
                        lot.IsTouched = true;
                        lot.AddMessage("Die Wünsche konnten erfüllt werden, dieses Los wird nicht mehr gebraucht");

                        AddMessage(lot.Course, lot.Subscription, "Die Wünsche konnten erfüllt werden, dieses Los wird nicht mehr gebraucht");
                    }
                }
            }


            foreach (var lotPot in LotPots.OrderByDescending(x => x.BookingRank))
            {
                // Ziehen
                ExecuteDrawing(lotPot);


                // Alle erfolgreichen Tickets ansehen => nicht mehr auf Warteliste
                foreach (var lot in lotPot.Lots.Where(x => !x.Subscription.OnWaitingList))
                {
                    // das zugehörige Spiel suchen
                    var game = Games.SingleOrDefault(x => x.UserId.Equals(lot.Subscription.UserId));

                    // Die besten n Lose, also Prio 1,2,3
                    var studentLots = game.Lots.OrderBy(x => x.Priority).Take(game.CoursesWanted).ToList();

                    // Student ist glücklich, wenn er alle seine Prio 1 bis n bekommen hat
                    var isHappy = !studentLots.Any(x => x.Subscription.OnWaitingList);

                    if (isHappy)
                    {
                        // jetzt können wir alle seine anderen Lose auf "invalid" setzen
                        // warum: das sind die Lose mit geringer Prio, die er nicht mehr braucht
                        // er hat schon die besten Prios erhalten
                        foreach (var drawingLot in studentLots.Where(x => x.Subscription.OnWaitingList))
                        {
                            drawingLot.IsValid   = false;
                            drawingLot.IsTouched = true;
                            drawingLot.AddMessage("Die Wünsche konnten erfüllt werden, dieses Los wird nicht mehr gebraucht");

                            AddMessage(drawingLot.Course, drawingLot.Subscription, "Die Wünsche konnten erfüllt werden, dieses Los wird nicht mehr gebraucht");
                        }
                    }
                }
            }

            // jetzt alle Plätze auflösen, die zu viel vergeben wurden
            var nReject = 0;

            foreach (var game in Games)
            {
                var studentLots = game.Lots.OrderBy(x => x.Priority).ToList();

                // Student ist glücklich, wenn er die Anzahl der gewünschten Plätze erhalten hat
                var isHappy = studentLots.Count(x => !x.Subscription.OnWaitingList) >= game.CoursesWanted;

                if (isHappy)
                {
                    var i = 0;
                    // jetzt können wir alle seine anderen Lose auf "invalid" setzen
                    foreach (var drawingLot in studentLots)
                    {
                        if (!drawingLot.Subscription.OnWaitingList)
                        {
                            i++;
                            if (i > game.CoursesWanted)
                            {
                                drawingLot.IsValid   = false;
                                drawingLot.IsTouched = true;
                                drawingLot.Subscription.OnWaitingList = true; // Zurück auf die Warteliste
                                drawingLot.AddMessage(
                                    "Zuviel vergebenes Los. Platz wird wieder freigegeben");

                                nReject++;

                                AddMessage(drawingLot.Course, drawingLot.Subscription, "Zuviel vergebenes Los. Platz wird wieder freigegeben");
                            }
                        }
                    }
                }
            }

            AddMessage(null, null, $"Ziehung beendet mit {nReject} wieder zurückgegebenen Plätzen");

            return(nReject);
        }
Beispiel #2
0
        private int DrawAllPots()
        {
            // Zuerst nachsehen, ob Wünsche offen sind
            foreach (var game in Games)
            {
                if (game.Seats.Count >= game.CoursesWanted)
                {
                    // alle Lose ungültig machen => hat schon alles
                    foreach (var lot in game.Lots)
                    {
                        lot.IsValid   = false;
                        lot.IsTouched = true;
                        lot.Message   = "Die Wünsche konnten erfüllt werden, Los wird nicht mehr gebraucht";
                    }
                }
            }


            foreach (var lotPot in LotPots.OrderByDescending(x => x.BookingRank))
            {
                // Ziehen
                ExecuteDrawing(lotPot);


                // Alle erfolgreichen Tickets ansehen => nicht mehr auf Warteliste
                foreach (var lot in lotPot.Lots.Where(x => !x.Subscription.OnWaitingList))
                {
                    // das zugehörige Spiel suchen
                    var game        = Games.SingleOrDefault(x => x.UserId.Equals(lot.Subscription.UserId));
                    var studentLots = game.Lots.OrderBy(x => x.Priority).Take(game.CoursesWanted).ToList();

                    // Student ist glücklich, wenn er seine Prio 1 bis n bekommen hat
                    var isHappy = !studentLots.Any(x => x.Subscription.OnWaitingList);

                    if (isHappy)
                    {
                        // jetzt können wir alle seine anderen Lose auf "invalid" setzen
                        foreach (var drawingLot in studentLots.Where(x => x.Subscription.OnWaitingList))
                        {
                            drawingLot.IsValid   = false;
                            drawingLot.IsTouched = true;
                            drawingLot.Message   = "Die Wünsche konnten erfüllt werden, Los wird nicht mehr gebraucht";
                        }
                    }
                }
            }

            // jetzt alle Plätze auflösen, die zu viel vergeben wurden
            var nReject = 0;

            foreach (var game in Games)
            {
                var studentLots = game.Lots.OrderBy(x => x.Priority).ToList();

                // Student ist glücklich, wenn er die Anzahl der gewünschten Plätze erhalten hat
                var isHappy = studentLots.Count(x => !x.Subscription.OnWaitingList) >= game.CoursesWanted;

                if (isHappy)
                {
                    var i = 0;
                    // jetzt können wir alle seine anderen Lose auf "invalid" setzen
                    foreach (var drawingLot in studentLots)
                    {
                        if (!drawingLot.Subscription.OnWaitingList)
                        {
                            i++;
                            if (i > game.CoursesWanted)
                            {
                                drawingLot.IsValid   = false;
                                drawingLot.IsTouched = true;
                                drawingLot.Subscription.OnWaitingList = true; // Zurück auf die Warteliste
                                drawingLot.Message =
                                    "Die Wünsche konnten erfüllt werden, Los wird nicht mehr gebraucht";

                                nReject++;
                            }
                        }
                    }
                }
            }
            return(nReject);
        }