Exemple #1
0
        public void InitLotPots()
        {
            AddMessage(null, null, "Beginn Initialisierung der Lostöpfe");
            AddMessage(null, null, $"Anzahl Lehrveranstaltungen: {Courses.Count}");

            var bookingService = new BookingService(db);

            // Pro Kurs die Lostöpfe anlegen
            foreach (var course in Courses)
            {
                var bookingLists = bookingService.GetBookingLists(course.Occurrence.Id);
                AddMessage(course, null, $"Anzahl Buchungslisten: {bookingLists.Count}");

                foreach (var bookingList in bookingLists)
                {
                    var lotPot = new DrawingLotPot();

                    lotPot.BookingList = bookingList;
                    lotPot.Course      = course;

                    // Alle Subscriptions durchgehen
                    // Sichern des Status vor der Verlosung!

                    foreach (var booking in bookingList.Bookings)
                    {
                        var subscription = booking.Subscription;
                        var game         =
                            Games.FirstOrDefault(x => x.UserId.Equals(subscription.UserId));

                        if (game == null)
                        {
                            var student = db.Students.Where(x => x.UserId.Equals(subscription.UserId))
                                          .OrderByDescending(x => x.Created).FirstOrDefault();
                            var lotteryGame = db.LotteryGames.Where(x =>
                                                                    x.Lottery.Id == Lottery.Id &&
                                                                    x.UserId.Equals(subscription.UserId))
                                              .OrderByDescending(x => x.Created).FirstOrDefault();

                            // Eintragung wurde außerhalb des Wahlverfahrens gemacht => Standard aufnehmen, damit Studierende an die Wahl dann auch rankommen
                            if (lotteryGame == null)
                            {
                                lotteryGame               = new LotteryGame();
                                lotteryGame.Lottery       = Lottery;
                                lotteryGame.UserId        = subscription.UserId;
                                lotteryGame.AcceptDefault = false;
                                lotteryGame.CoursesWanted = Lottery.MaxConfirm;
                                lotteryGame.Created       = DateTime.Now;
                                lotteryGame.LastChange    = DateTime.Now; // bisher nicht angegeben

                                Lottery.Games.Add(lotteryGame);
                            }

                            game             = new DrawingGame();
                            game.UserId      = subscription.UserId;
                            game.Student     = student;
                            game.LotteryGame = lotteryGame;
                            game.Lottery     = Lottery;

                            Games.Add(game);
                        }

                        // Trennung von bereits erhaltenen Plätzen und Losen
                        if (subscription.OnWaitingList == false)
                        {
                            var seat = new DrawingSeat();
                            seat.Course       = course;
                            seat.Subscription = subscription;

                            game.Seats.Add(seat);

                            AddMessage(course, subscription, "Vorhandener Platz");
                        }
                        else
                        {
                            var drawingLot = new DrawingLot();
                            drawingLot.IsValid      = true; // Am Beginn ist das Ticket gültig
                            drawingLot.IsTouched    = false;
                            drawingLot.Course       = course;
                            drawingLot.Subscription = subscription;

                            game.Lots.Add(drawingLot);

                            lotPot.Lots.Add(drawingLot);

                            AddMessage(course, subscription, "Ein Los für die Verlosung erhalten");
                        }
                    }

                    LotPots.Add(lotPot);
                }
            }
        }
Exemple #2
0
        private void TryToHelpJinx()
        {
            foreach (var game in Games)
            {
                var studentLots = game.Lots.OrderBy(x => x.Priority).ToList();

                // Student ist Ober-Pechvogel, wenn er gar nichts erhalten hat => zuerst 1 Kurs
                // gar nichts: Keinen Platz und auch kein Los auf der Warteliste

                // alte Formulierung
                // var isJinx = !game.Seats.Any() && studentLots.All(x => x.IsValid && x.Subscription.OnWaitingList);

                var nSeats            = game.Seats.Count;
                var nLots             = studentLots.Count;
                var nWaitingLots      = studentLots.Count(x => x.Subscription.OnWaitingList);
                var validLots         = studentLots.Count(x => x.IsValid);
                var nWaitingValidLots = studentLots.Count(x => x.IsValid && x.Subscription.OnWaitingList);

                AddMessage(game.UserId, $"Plätze: {nSeats}, Lose {nLots}, auf Warteliste {nWaitingLots}, valide {validLots}, valide und Warteliste {nWaitingValidLots}");


                bool isJinx = nSeats == 0 && nLots == nWaitingLots;


                if (isJinx)
                {
                    AddMessage(game.UserId, $"Bisher keinen Platz erhalten");

                    // Suche einen Kurs, der noch freie Plätze hat und in dem er noch nicht drin ist
                    var availableCourses = LotPots.Where(x =>
                                                         !x.Course.Occurrence.Subscriptions.Any(s => s.UserId.Equals(game.UserId)) &&
                                                         x.SeatsAvailable > 0).OrderByDescending(x => x.SeatsAvailable).ToList();

                    AddMessage(null, null, $"Es sind {availableCourses.Count} LVs noch frei");

                    var availableCourse = availableCourses.FirstOrDefault();

                    if (availableCourse == null)
                    {
                        game.Message = "Im gesamten Wahlverfahren stehen keine freien Plätze mehr zur Verfügung.";
                    }
                    else
                    {
                        if (game.AcceptDefault)
                        {
                            // eine neue Eintragung
                            var subscription = new OccurrenceSubscription();
                            subscription.TimeStamp     = DateTime.Now;
                            subscription.UserId        = game.UserId;
                            subscription.OnWaitingList = false;
                            subscription.Priority      = 0;
                            subscription.Occurrence    = availableCourse.Course.Occurrence;

                            // Die Subscription hinzufügen
                            availableCourse.Course.Occurrence.Subscriptions.Add(subscription);

                            // Die Bookinglist aktualisieren
                            availableCourse.BookingList.Bookings.Add(new Booking.Data.Booking
                            {
                                Student      = game.Student,
                                Subscription = subscription
                            });

                            var lot = new DrawingLot();
                            lot.IsTouched = true;
                            lot.IsValid   = true;
                            lot.AddMessage("Platz über Pechvogelregel erhaltem");
                            lot.Subscription = subscription;
                            lot.Course       = availableCourse.Course;

                            game.Lots.Add(lot);

                            availableCourse.Lots.Add(lot);

                            AddMessage(lot.Course, lot.Subscription, "Platz über Pechvogelregel erhaltem");

                            /*
                             * var lotPot = LotPots.SingleOrDefault(x => x.Course.Id == availableCourse.Course.Id);
                             * lotPot.Lots.Add(lot);
                             */
                        }
                        else
                        {
                            AddMessage(game.UserId, "Will nichts anderes. Es hätte noch einen Platz in einer anderen Lehrveranstaltung gegeben.");

                            game.Message =
                                "Es hätte noch einen Platz in einer anderen Lehrveranstaltung gegeben.";
                        }
                    }
                }
            }
        }
Exemple #3
0
        private int TryToFillUp()
        {
            var nSuccess = 0;

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

                // Hat Student alle Wünsche erfüllt bekommen
                var isJinx = (studentLots.Count(x => !x.Subscription.OnWaitingList) + game.Seats.Count) < game.CoursesWanted;

                if (isJinx)
                {
                    // Suche einen Kurs, der noch freie Plätze hat und in dem er noch nicht drin ist
                    var availableCourse = LotPots.Where(x =>
                                                        !x.Course.Occurrence.Subscriptions.Any(s => s.UserId.Equals(game.UserId)) &&
                                                        x.SeatsAvailable > 0).OrderByDescending(x => x.SeatsAvailable).FirstOrDefault();

                    if (availableCourse == null)
                    {
                        game.Message = "Im gesamten Wahlverfahren stehen keine freien Plätze mehr zur Verfügung.";
                    }
                    else
                    {
                        if (game.AcceptDefault)
                        {
                            // eine neue Eintragung
                            var subscription = new OccurrenceSubscription();
                            subscription.TimeStamp     = DateTime.Now;
                            subscription.UserId        = game.UserId;
                            subscription.OnWaitingList = false;
                            subscription.Priority      = 0;
                            subscription.Occurrence    = availableCourse.Course.Occurrence;

                            // Die Subscription hinzufügen
                            availableCourse.Course.Occurrence.Subscriptions.Add(subscription);

                            // Die Bookinglist aktualisieren
                            availableCourse.BookingList.Bookings.Add(new Booking.Data.Booking
                            {
                                Student      = game.Student,
                                Subscription = subscription
                            });

                            // Ein neues Los
                            var lot = new DrawingLot();
                            lot.IsTouched = true;
                            lot.IsValid   = true;
                            lot.AddMessage("Platz durch Auffüllen erhalten");
                            lot.Subscription = subscription;
                            lot.Course       = availableCourse.Course;

                            game.Lots.Add(lot);

                            availableCourse.Lots.Add(lot);

                            /*
                             * var lotPot = LotPots.SingleOrDefault(x => x.Course.Id == availableCourse.Course.Id);
                             * lotPot.Lots.Add(lot);
                             */

                            AddMessage(lot.Course, lot.Subscription, "Platz durch Auffüllen erhalten");

                            nSuccess++;
                        }
                        else
                        {
                            AddMessage(game.UserId, "Will nichts anderes. Es hätte noch einen Platz in einer anderen Lehrveranstaltung gegeben.");

                            game.Message =
                                "Es hätte noch einen Platz in einer anderen Lehrveranstaltung gegeben.";
                        }
                    }
                }
            }

            return(nSuccess);
        }
Exemple #4
0
        private void TryToHelpJinx()
        {
            foreach (var game in Games)
            {
                var studentLots = game.Lots.OrderBy(x => x.Priority).ToList();

                // Student ist Ober-Pechvogel, wenn er gar nichts erhalten hat => zuerst 1 Kurs
                // gar nichts: Keinen Platz und auch kein Los auf der Warteliste
                var isJinx = !game.Seats.Any() && studentLots.All(x => x.IsValid && x.Subscription.OnWaitingList);

                if (isJinx)
                {
                    // Suche einen Kurs, der noch freie Plätze hat und in dem er noch nicht drin ist
                    var availableCourse = LotPots.Where(x =>
                                                        !x.Course.Occurrence.Subscriptions.Any(s => s.UserId.Equals(game.UserId)) &&
                                                        x.RemainingSeats > 0).OrderByDescending(x => x.RemainingSeats).FirstOrDefault();

                    if (availableCourse == null)
                    {
                        game.Message = "Im gesamten Wahlverfahren stehen keine freien Plätze mehr zur Verfügung.";
                    }
                    else
                    {
                        if (game.AcceptDefault)
                        {
                            // eine neue Eintragung
                            var subscription = new OccurrenceSubscription();
                            subscription.TimeStamp     = DateTime.Now;
                            subscription.UserId        = game.UserId;
                            subscription.OnWaitingList = false;
                            subscription.Priority      = 0;
                            subscription.Occurrence    = availableCourse.Course.Occurrence;

                            // Die Subscription hinzufügen
                            availableCourse.Course.Occurrence.Subscriptions.Add(subscription);

                            // Die Bookinglist aktualisieren
                            availableCourse.BookingList.Bookings.Add(new Booking.Data.Booking
                            {
                                Student      = game.Student,
                                Subscription = subscription
                            });

                            var lot = new DrawingLot();
                            lot.IsTouched    = true;
                            lot.IsValid      = true;
                            lot.Message      = "Mindestens mal eine Lehrveranstaltung für den Pechvogel";
                            lot.Subscription = subscription;
                            lot.Course       = availableCourse.Course;

                            game.Lots.Add(lot);

                            availableCourse.Lots.Add(lot);

                            /*
                             * var lotPot = LotPots.SingleOrDefault(x => x.Course.Id == availableCourse.Course.Id);
                             * lotPot.Lots.Add(lot);
                             */
                        }
                        else
                        {
                            game.Message =
                                "Es hätte noch einen Platz in einer anderen Lehrveranstaltung gegeben.";
                        }
                    }
                }
            }
        }