Esempio n. 1
0
        public static MvcHtmlString SubscriptionLabel(this HtmlHelper htmlHelper, OccurrenceSubscription subscription)
        {
            var sb = new StringBuilder();

            var iconName = "";

            if (subscription.OnWaitingList)
            {
                iconName = "fa-hourglass";
            }
            else
            {
                if (subscription.IsConfirmed)
                {
                    iconName = "fa-group";
                }
                else
                {
                    iconName = "fa-ticket";
                }
            }

            sb.AppendFormat(
                "<i class=\"fa {0}\"></i>", iconName);

            return(new MvcHtmlString(sb.ToString()));
        }
Esempio n. 2
0
        public BookingTicket Subscribe(string userId, Guid courseId)
        {
            var ticket = new BookingTicket();

            var course  = Db.Activities.OfType <Course>().SingleOrDefault(x => x.Id == courseId);
            var student = GetStudent(userId);

            ticket.Course = course;
            ticket.UserId = userId;

            var occurrence = course.Occurrence;
            OccurrenceSubscription subscription = null;

            using (var transaction = Db.Database.BeginTransaction())
            {
                subscription = occurrence.Subscriptions.FirstOrDefault(x => x.UserId.Equals(userId));

                var bookingLists = GetBookingLists(occurrence.Id);
                var bookingState = new BookingState();
                bookingState.Student      = student;
                bookingState.Occurrence   = occurrence;
                bookingState.BookingLists = bookingLists;
                bookingState.Init();

                var myBookingList = bookingState.MyBookingList;

                if (subscription != null)
                {
                    DeleteSubscription(subscription);
                    if (myBookingList != null && !subscription.OnWaitingList)
                    {
                        var succeedingBooking = myBookingList.GetSucceedingBooking();
                        if (succeedingBooking != null)
                        {
                            succeedingBooking.Subscription.OnWaitingList = false;
                            ticket.SucceedingSubscription = succeedingBooking.Subscription;
                        }
                    }
                }
                else
                {
                    if (myBookingList != null)
                    {
                        subscription               = new OccurrenceSubscription();
                        subscription.TimeStamp     = DateTime.Now;
                        subscription.Occurrence    = occurrence;
                        subscription.UserId        = userId;
                        subscription.OnWaitingList = bookingState.AvailableSeats <= 0;
                        Db.Subscriptions.Add(subscription);
                        ticket.Subscription = subscription;
                    }
                }

                Db.SaveChanges();
                transaction.Commit();
            }

            return(ticket);
        }
Esempio n. 3
0
 private void AddMessage(Course course, OccurrenceSubscription subscription, string remark)
 {
     Messages.Add(new DrawingMessage
     {
         TimeStamp    = DateTime.Now,
         Course       = course,
         Subscription = subscription,
         UserId       = subscription?.UserId,
         Remark       = remark
     });
 }
Esempio n. 4
0
        public ActionResult CreateRequest(SupervisionRequestModel model)
        {
            var user        = GetCurrentUser();
            var supervision = Db.Activities.OfType <Supervision>().SingleOrDefault(x => x.Id == model.Supervision.Id);

            // hat schon eine Anfrage bei diesem Angebot
            if (supervision.Occurrence.Subscriptions.Any(x => x.UserId.Equals(user.Id)))
            {
                // Schon eingetragen
                // Fehlermeldung: da sind sie schon drin
                return(RedirectToAction("Index", "Dashboard"));
            }

            // Lehrende sollten sehen können, wo jemand eingetragen ist
            // Die Ablehnungs Mails sind dann Nachweis für ein "Nichtfinden"

            var subscription = new OccurrenceSubscription
            {
                UserId           = user.Id,
                SubscriberRemark = model.Description,
                TimeStamp        = DateTime.Now,
                OnWaitingList    = true,
                IsConfirmed      = false,
                Occurrence       = supervision.Occurrence
            };

            Db.Subscriptions.Add(subscription);
            Db.SaveChanges();

            // EMail versenden
            // Mail an Betreuer
            if (supervision.Owners.Any())
            {
                var member   = supervision.Owners.First().Member;
                var hostUser = GetUser(member.UserId);

                var mailModel = new ThesisRequestMailModel
                {
                    Supervision = supervision,
                    Request     = subscription,
                    Requester   = user,     // der anfragende Student
                    User        = hostUser, // der Betreuuer
                };

                var mail = new MailController();
                mail.ThesisRequestEMail(mailModel).Deliver();
            }



            return(RedirectToAction("Index", "Dashboard"));
        }
Esempio n. 5
0
        public int GetPosition(OccurrenceSubscription subscription)
        {
            var orderedWaiting = WaitingList.OrderBy(x => x.Subscription.TimeStamp).ToList();

            var booking = orderedWaiting.FirstOrDefault(x => x.Subscription.Id == subscription.Id);

            if (booking != null)
            {
                return(orderedWaiting.IndexOf(booking) + 1);
            }

            return(-1);
        }
Esempio n. 6
0
        private OccurrenceSubscription AddOnWaitingList(Occurrence occurrence, ApplicationUser user)
        {
            var subscription = new OccurrenceSubscription
            {
                UserId        = user.Id,
                TimeStamp     = DateTime.Now,
                OnWaitingList = true,
                IsConfirmed   = false
            };

            occurrence.Subscriptions.Add(subscription);
            Db.SaveChanges();

            return(subscription);
        }
Esempio n. 7
0
        public void DeleteSubscription(OccurrenceSubscription subscription)
        {
            var allDrawings = Db.SubscriptionDrawings.Where(x => x.Subscription.Id == subscription.Id).ToList();

            foreach (var drawing in allDrawings)
            {
                Db.SubscriptionDrawings.Remove(drawing);
            }

            var bets = subscription.Bets.ToList();

            foreach (var bet in bets)
            {
                Db.LotteriyBets.Remove(bet);
            }

            Db.Subscriptions.Remove(subscription);

            Db.SaveChanges();
        }
Esempio n. 8
0
        public void SendSucceedingEMail(Course course, OccurrenceSubscription subscription)
        {
            var email = new SubscriptionEmail("Succeeding")
            {
                Subject = "[nine] Eintragung in " + course.Name,

                Course       = course,
                Subscription = subscription,
                Student      = UserService.GetUser(subscription.UserId)
            };

            try
            {
                EmailService.Send(email);
                Logger.InfoFormat("E-Mail an {0} erfolgreich versendet", email.Student.Email);
            }
            catch (Exception exMail)
            {
                Logger.ErrorFormat("Fehler bei E-Mail Versand an: {0} - Ursache {1}", email.Student.Email,
                                   exMail.Message);
            }
        }
Esempio n. 9
0
        public void SendLotteryRemoveMail(LotteryDrawing drawing, OrganiserMember member, Lottery lottery, Course course, OccurrenceSubscription subscription)
        {
            var email = new LotteryDrawingStudentEmail("LotteryRemoveStudent")
            {
                Subject      = "[nine] Wahlverfahren " + Drawing.Lottery.Name,
                Game         = null,
                User         = UserService.GetUser(subscription.UserId),
                Lottery      = lottery,
                Drawing      = drawing,
                Member       = member,
                Course       = course,
                Subscription = subscription,
            };

            try
            {
                if (email.User != null)
                {
                    EmailService.Send(email);
                    Logger.InfoFormat("E-Mail an {0} erfolgreich versendet", email.User.Email);
                }
            }
            catch (Exception exMail)
            {
                Logger.ErrorFormat("Fehler bei E-Mail Versand an: {0} - Ursache {1}", email.User.Email,
                                   exMail.Message);
            }
        }
Esempio n. 10
0
        public IQueryable <SubscriptionDto> Subscribe([FromBody] SubscriptionBasketModel model)
        {
            var list = new List <SubscriptionDto>();

            var user = GetUser(model.User.Id);

            if (user == null)
            {
                var subModel = new SubscriptionDto
                {
                    CourseId = Guid.Empty,
                    IsValid  = false,
                    Message  = $"Invaild user with id {model.User.Id}"
                };
                list.Add(subModel);
                return(list.AsQueryable());
            }


            foreach (var courseModel in model.Courses)
            {
                var subModel = new SubscriptionDto();
                subModel.CourseId = courseModel.Id;
                subModel.IsValid  = true;

                var course = Db.Activities.OfType <Course>().SingleOrDefault(x => x.Id == courseModel.Id);

                if (course != null)
                {
                    var subscription = course.Occurrence.Subscriptions.FirstOrDefault(x => x.UserId.Equals(model.User.Id));

                    if (subscription == null)
                    {
                        subscription            = new OccurrenceSubscription();
                        subscription.UserId     = model.User.Id;
                        subscription.TimeStamp  = DateTime.Now;
                        subscription.Occurrence = course.Occurrence;

                        // TODO: Status "Warteliste" dafür dann den Service bauen
                        // einfach: wenn LV zu CIE gehört, dann Warteliste

                        bool isCie = course.SemesterGroups.Any(x =>
                                                               x.CapacityGroup.CurriculumGroup.Curriculum.ShortName.StartsWith("CIE"));

                        if (isCie)
                        {
                            subscription.OnWaitingList = true;
                        }

                        subscription.SubscriberRemark = "Über API eingeschrieben";

                        subscription.Priority = 1;


                        Db.Subscriptions.Add(subscription);
                    }
                }
                else
                {
                    subModel.IsValid = false;
                    subModel.Message = $"Inavlid Course with Id {courseModel.Id}";
                }

                list.Add(subModel);
            }

            Db.SaveChanges();

            return(list.AsQueryable());
        }
Esempio n. 11
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="date"></param>
 /// <param name="dateType"></param>
 public ActivityDateSummary(ActivityDate date, OccurrenceSubscription sub)
 {
     Date         = date;
     DateType     = ActivityDateType.Subscription;
     Subscription = sub;
 }
Esempio n. 12
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="occId"></param>
        /// <param name="user"></param>
        /// <returns></returns>
        public SubscriptionResponse SubscribeOccurrence(Guid occId, ApplicationUser user)
        {
            var occurrence = Db.Occurrences.SingleOrDefault(ac => ac.Id == occId);

            if (occurrence == null || user == null)
            {
                return(GetErrorResponse("Missing Or Wrong Occurrence Or Missing User", false));
            }

            // Nach einer bestehenden Eintragung suchen
            // sollte aus irgendeinem Grund bereits mehrere Eintragungen bestehen, dann ist das hier nicht von Interesse
            // es genügt die Information, dass bereits eine Eintragung existiert
            OccurrenceSubscription subscription = occurrence.Subscriptions.FirstOrDefault(s => s.UserId.Equals(user.Id));

            if (subscription != null)
            {
                return(new SubscriptionResponse
                {
                    HasError = false,
                    Subscription = subscription
                });
            }

            #region Zeitraum prüfen
            var timingState = GetSubscriptionState(occurrence);


            if (timingState == SubscriptionState.BeforeSubscriptionPhase)
            {
                return(new SubscriptionResponse
                {
                    HasError = true,
                    ShowUser = true,
                    Message = string.Format("Noch zu früh! Eintragung erst ab {0} möglich", occurrence.FromDateTime.Value),
                });
            }

            if (timingState == SubscriptionState.AfterSubscriptionPhase ||
                timingState == SubscriptionState.DuringOccurrence ||
                timingState == SubscriptionState.AfterOccurrence)
            {
                return(new SubscriptionResponse
                {
                    HasError = true,
                    ShowUser = true,
                    Message = "Zu spät! Keine Eintragung mehr möglich!",
                });
            }
            #endregion

            #region Alles auf Warteliste: Inaktiv gesetzt oder Platzverlosung

            var hasLottery = Db.Lotteries.Any(x => x.Occurrences.Any(y => y.Id == occurrence.Id));

            if (occurrence.IsAvailable == false || hasLottery)
            {
                subscription = AddOnWaitingList(occurrence, user);
                return(new SubscriptionResponse
                {
                    HasError = false,
                    Subscription = subscription
                });
            }

            #endregion


            #region Gruppen berücksichtigen

            if (occurrence.UseGroups)
            {
                var semSubService = new SemesterSubscriptionService();

                // die beste Gruppe ermitteln => die erste, die passt
                var group = semSubService.GetBestFit(user.Id, occurrence.Groups);

                // Wenn der Benutzer nicht zur erforderlichen Gruppe gehört
                // dan automatisch auf der Warteliste positionieren
                if (group == null)
                {
                    subscription = AddOnWaitingList(occurrence, user);
                    return(new SubscriptionResponse
                    {
                        HasError = false,
                        Subscription = subscription
                    });
                }

                // als nächstes die Anzahl der Teilnehmer in dieser Gruppe ermitteln
                var participants = GetSubscriptionsForGroup(occurrence.Subscriptions, group);

                // Es ist noch Platz in der Gruppe
                if (participants.Count < group.Capacity)
                {
                    subscription = AddOnParticipantList(occurrence, user);
                    return(new SubscriptionResponse
                    {
                        HasError = false,
                        Subscription = subscription
                    });
                }

                // Alle Plätze in der Gruppe sind belegt
                // auf die Warteliste
                subscription = AddOnWaitingList(occurrence, user);
                return(new SubscriptionResponse
                {
                    HasError = false,
                    Subscription = subscription
                });
            }
            else
            {
                // keine Gruppen berücksichtigen
                // und es interessiert hier nicht die Annahme des Platzes!
                var nParticipants = occurrence.Subscriptions.Count(s => s.OnWaitingList == false);
                if (occurrence.Capacity < 0 || nParticipants < occurrence.Capacity)
                {
                    subscription = AddOnParticipantList(occurrence, user);
                    return(new SubscriptionResponse
                    {
                        HasError = false,
                        Subscription = subscription
                    });
                }


                // Auf Warteliste setzen
                // Spezialfälle
                // Bei einem Slot oder Datum (Sprechstunde) gibt es keine Wartelisten
                var summary = new ActivityService().GetSummary(occurrence.Id);
                if (summary is ActivitySlotSummary || summary is ActivityDateSummary)
                {
                    return(new SubscriptionResponse
                    {
                        HasError = true,
                        ShowUser = true,
                        Message = "Leider bereits belegt",
                    });
                }
                else
                {
                    subscription = AddOnWaitingList(occurrence, user);
                    return(new SubscriptionResponse
                    {
                        HasError = false,
                        Subscription = subscription
                    });
                }
            }

            #endregion
        }
Esempio n. 13
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);
        }
Esempio n. 14
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.";
                        }
                    }
                }
            }
        }
Esempio n. 15
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="id">Id des Kurses</param>
        /// <returns></returns>

        public PartialViewResult Subscribe(Guid id)
        {
            var logger = LogManager.GetLogger("Booking");

            var user    = GetCurrentUser();
            var student = StudentService.GetCurrentStudent(user);
            var course  = Db.Activities.OfType <Course>().SingleOrDefault(x => x.Id == id);
            OccurrenceSubscription succeedingSubscription = null;

            Occurrence             occ          = course.Occurrence;
            OccurrenceSubscription subscription = null;

            using (var transaction = Db.Database.BeginTransaction())
            {
                subscription = occ.Subscriptions.FirstOrDefault(x => x.UserId.Equals(user.Id));

                var bookingService = new BookingService(Db);
                var bookingLists   = bookingService.GetBookingLists(occ.Id);
                var bookingState   = new BookingState
                {
                    Student      = student,
                    Occurrence   = occ,
                    BookingLists = bookingLists
                };
                bookingState.Init();

                var bookingList = bookingState.MyBookingList;

                if (subscription == null)
                {
                    // eintragen
                    // den Status aus den Buchungslisten ermitteln
                    // ermittle Buchungsliste
                    // wenn eine Liste
                    // wenn voll, dann Warteliste
                    // sonst Teilnehmer
                    // sonst
                    // Fehlermeldung an Benutzer mit Angabe des Grunds

                    if (bookingList != null)
                    {
                        subscription = new OccurrenceSubscription
                        {
                            TimeStamp     = DateTime.Now,
                            Occurrence    = occ,
                            UserId        = user.Id,
                            OnWaitingList = bookingState.AvailableSeats <= 0
                        };

                        Db.Subscriptions.Add(subscription);
                    }
                }
                else
                {
                    // austragen
                    var subscriptionService = new SubscriptionService(Db);
                    subscriptionService.DeleteSubscription(subscription);

                    // Nachrücken
                    if (bookingList != null)
                    {
                        var succBooking = bookingList.GetSucceedingBooking();
                        if (succBooking != null)
                        {
                            succBooking.Subscription.OnWaitingList = false;
                            succeedingSubscription = succBooking.Subscription;
                        }
                    }
                }

                Db.SaveChanges();
                transaction.Commit();
            }

            // Mail an Nachrücker versenden
            if (succeedingSubscription != null)
            {
                var mailService = new SubscriptionMailService();
                mailService.SendSucceedingEMail(course, succeedingSubscription);

                var subscriber = GetUser(succeedingSubscription.UserId);
                logger.InfoFormat("{0} ({1}) for [{2}]: set on participient list",
                                  course.Name, course.ShortName, subscriber.UserName);
            }

            // jetzt neu abrufen und anzeigen
            var model = GetBookingStateModel(course.Id);

            return(PartialView("_CourseSummaryBookingBox", model));
        }
Esempio n. 16
0
        public ActionResult Import(InvitationFileModel model)
        {
            var invitationList = CreateCheckModel(model);
            var host           = GetCurrentUser();

            var studentService = new StudentService(Db);

            /*
             * if (!string.IsNullOrEmpty(invitationList.Error))
             *  return View("InvitationList", invitationList);
             */


            foreach (var invitation in invitationList.Invitations)
            {
                var user = UserManager.FindByEmail(invitation.Email);

                if (user == null)
                {
                    var now = DateTime.Now;
                    user = new ApplicationUser
                    {
                        UserName       = invitation.Email,
                        Email          = invitation.Email,
                        FirstName      = invitation.FirstName,
                        LastName       = invitation.LastName,
                        Registered     = now,
                        MemberState    = MemberState.Student,
                        Remark         = "CIE",
                        ExpiryDate     = null, // Einladung bleibt dauerhaft bestehen - Deprovisionierung automatisch
                        Submitted      = now,
                        EmailConfirmed =
                            true,            // damit ist auch ein "ForgotPassword" möglich, auch wenn er die Einladung nicht angenommen hat.
                        IsApproved = true,   // Damit bekommt der Nutzer von Anfang an E-Mails
                        Faculty    = host.Id // Benutzer der eingeladen hat
                    };

                    // Benutzer anlegen, mit Dummy Passwort
                    var result = UserManager.Create(user, "Cie98#lcl?");

                    if (result.Succeeded)
                    {
                        // analog Forget E-Mail Versand
                        string code = UserManager.GeneratePasswordResetToken(user.Id);

                        var mailModel = new ForgotPasswordMailModel
                        {
                            User          = user,
                            Token         = code,
                            CustomSubject = "Your NINE Account",
                            CustomBody    = "",
                            Attachments   = null,
                            IsNewAccount  = true,
                        };


                        try
                        {
                            new MailController().InvitationMail(mailModel, host, "en").Deliver();
                        }
                        catch (SmtpFailedRecipientException ex)
                        {
                            invitation.Remark = ex.Message;
                        }
                    }
                }

                var student = studentService.GetCurrentStudent(user);
                if (student == null)
                {
                    student               = new Student();
                    student.Created       = DateTime.Now;
                    student.Curriculum    = invitation.Curriculum;
                    student.FirstSemester = invitation.Semester;
                    student.UserId        = user.Id;

                    Db.Students.Add(student);
                }


                if (invitation.Course != null)
                {
                    var subscription =
                        invitation.Course.Occurrence.Subscriptions.FirstOrDefault(x => x.UserId.Equals(user.Id));

                    if (subscription == null)
                    {
                        subscription               = new OccurrenceSubscription();
                        subscription.TimeStamp     = DateTime.Now;
                        subscription.UserId        = user.Id;
                        subscription.OnWaitingList = invitation.OnWaitinglist;
                        subscription.Occurrence    = invitation.Course.Occurrence;
                        subscription.HostRemark    = invitation.Remark;
                        invitation.Course.Occurrence.Subscriptions.Add(subscription);
                    }
                }
            }

            Db.SaveChanges();

            return(View("InvitationList", invitationList));
        }
Esempio n. 17
0
        public ActionResult Import(InvitationFileModel model)
        {
            var invitationList = CreateCheckModel(model);
            var host           = GetCurrentUser();

            var studentService = new StudentService(Db);

            /*
             * if (!string.IsNullOrEmpty(invitationList.Error))
             *  return View("InvitationList", invitationList);
             */


            foreach (var invitation in invitationList.Invitations)
            {
                var user = UserManager.FindByEmail(invitation.Email);

                if (user == null)
                {
                    var now = DateTime.Now;
                    user = new ApplicationUser
                    {
                        UserName       = invitation.Email,
                        Email          = invitation.Email,
                        FirstName      = invitation.FirstName,
                        LastName       = invitation.LastName,
                        Registered     = now,
                        MemberState    = MemberState.Student,
                        Remark         = "CIE",
                        ExpiryDate     = null,   // Einladung bleibt dauerhaft bestehen - Deprovisionierung automatisch
                        Submitted      = now,
                        EmailConfirmed = true,   // damit ist auch ein "ForgotPassword" möglich, auch wenn er die Einladung nicht angenommen hat.
                        IsApproved     = true,   // Damit bekommt der Nutzer von Anfang an E-Mails
                        Faculty        = host.Id // Benutzer der eingeladen hat
                    };

                    // Benutzer anlegen, mit Dummy Passwort
                    var result = UserManager.Create(user, "Cie98#lcl?");
                }

                var student = studentService.GetCurrentStudent(user);
                if (student == null)
                {
                    student               = new Student();
                    student.Created       = DateTime.Now;
                    student.Curriculum    = invitation.Curriculum;
                    student.FirstSemester = invitation.Semester;
                    student.UserId        = user.Id;

                    Db.Students.Add(student);
                }


                if (invitation.Course != null)
                {
                    var subscription =
                        invitation.Course.Occurrence.Subscriptions.FirstOrDefault(x => x.UserId.Equals(user.Id));

                    if (subscription == null)
                    {
                        subscription               = new OccurrenceSubscription();
                        subscription.TimeStamp     = DateTime.Now;
                        subscription.UserId        = user.Id;
                        subscription.OnWaitingList = invitation.OnWaitinglist;
                        subscription.Occurrence    = invitation.Course.Occurrence;
                        subscription.HostRemark    = invitation.Remark;
                        invitation.Course.Occurrence.Subscriptions.Add(subscription);
                    }
                }
            }

            Db.SaveChanges();

            return(View("InvitationList", invitationList));
        }
Esempio n. 18
0
        public ActionResult Subscribe(StudentSubscriptionModel model)
        {
            var org      = GetMyOrganisation();
            var semester = SemesterService.GetSemester(model.SemesterName.Trim());

            if (semester == null)
            {
                ModelState.AddModelError("SemesterName", "Es existiert kein Semester mit dieser Bezeichnung");
                return(View(model));
            }


            var courses = Db.Activities.OfType <Course>().Where(x =>
                                                                x.ShortName.Equals(model.CourseShortName.Trim()) &&
                                                                x.SemesterGroups.Any(g =>
                                                                                     g.Semester.Id == semester.Id && g.CapacityGroup.CurriculumGroup.Curriculum.Organiser.Id == org.Id)).ToList();

            if (!courses.Any())
            {
                ModelState.AddModelError("CourseShortName", "Es existiert keine Lehrveranstaltung mit dieser Bezeichnung");
                return(View(model));
            }

            if (courses.Count > 1)
            {
                ModelState.AddModelError("CourseShortName", $"Bezeichnung nicht eindeutig. Es existieren {courses.Count} Lehrveranstaltungen mit dieser Bezeichnung");
                return(View(model));
            }

            var host   = GetCurrentUser();
            var course = courses.First();

            var subscription = course.Occurrence.Subscriptions.FirstOrDefault(x => x.UserId.Equals(model.User.Id));

            if (subscription != null)
            {
                ModelState.AddModelError("CourseShortName", "Ist bereits in dieser Lehrveranstaltung eingetragen.");
                return(View(model));
            }

            subscription               = new OccurrenceSubscription();
            subscription.TimeStamp     = DateTime.Now;
            subscription.UserId        = model.User.Id;
            subscription.OnWaitingList = false;
            subscription.Occurrence    = course.Occurrence;
            course.Occurrence.Subscriptions.Add(subscription);

            // wenn es ein Wahlverfahren gibt, dann als Prio 1
            var lottery =
                Db.Lotteries.FirstOrDefault(x => x.Occurrences.Any(y => y.Id == course.Occurrence.Id));

            if (lottery != null)
            {
                subscription.Priority = 1;

                var game = lottery.Games.FirstOrDefault(x => x.UserId.Equals(model.User.Id));
                if (game == null)
                {
                    game = new LotteryGame
                    {
                        Lottery       = lottery,
                        UserId        = subscription.UserId,
                        AcceptDefault = false,
                        CoursesWanted = lottery.MaxConfirm,
                        Created       = DateTime.Now,
                        LastChange    = DateTime.Now
                    };
                    lottery.Games.Add(game);
                }
            }

            Db.SaveChanges();

            // Bei Erfolg Mail versenden
            var mailService = new SubscriptionMailService();

            mailService.SendSubscriptionEMail(course, subscription, host);



            return(RedirectToAction("CoursePlan", new { id = model.User.Id, semId = semester.Id }));
        }
Esempio n. 19
0
        public ActionResult UploadDates(Assessment model, HttpPostedFileBase resultFile)
        {
            var user       = GetCurrentUser();
            var assessment = Db.Assessments.SingleOrDefault(x => x.Id == model.Id);
            var member     = assessment.Committee.Members.FirstOrDefault(x => !string.IsNullOrEmpty(x.Member.UserId) && x.Member.UserId.Equals(user.Id));

            var userInfoService = new UserInfoService();
            var errors          = new List <string>();


            if (resultFile == null)
            {
                return(null);
            }

            var officeHour = GetOfficeHour(assessment);


            var bytes = new byte[resultFile.ContentLength];

            resultFile.InputStream.Read(bytes, 0, resultFile.ContentLength);

            var stream = new System.IO.MemoryStream(bytes);
            var reader = new System.IO.StreamReader(stream, Encoding.Default);
            var text   = reader.ReadToEnd();

            string[] lines = text.Split('\n');

            foreach (var line in lines)
            {
                string newline = line.Trim();

                if (!string.IsNullOrEmpty(newline))
                {
                    string[] words = newline.Split(';');

                    var firstName = words[0].Trim();
                    var lastName  = words[1].Trim();
                    var email     = words[2].Trim();
                    var date      = DateTime.ParseExact(words[3].Trim(), "dd.MM.yyyy", null);
                    var from      = TimeSpan.ParseExact(words[4].Trim(), @"h\:mm", null);
                    var until     = TimeSpan.ParseExact(words[5].Trim(), @"h\:mm", null);

                    var candUser = userInfoService.GetUserByEmail(email);

                    if (candUser == null)
                    {
                        var msg = $"Kein Benutzer für E-Mail Adresse {email} vorhanden";
                        errors.Add(msg);
                        continue;
                    }

                    if (!(candUser.FirstName.Trim().ToLower().Equals(firstName.ToLower()) &&
                          candUser.LastName.Trim().ToLower().Equals(lastName.ToLower())))
                    {
                        var msg = $"Angaben für den Benutzer {email} stimmen nicht überein: Datei: {firstName} {lastName}, Datenbank: {candUser.FirstName} {candUser.LastName}";
                        errors.Add(msg);
                        continue;
                    }


                    var candidate = assessment.Candidatures.SingleOrDefault(x => x.UserId.Equals(candUser.Id));

                    if (candidate == null)
                    {
                        var msg = $"Benutzer {email} nicht im Verfahren dabei";
                        errors.Add(msg);
                        continue;
                    }


                    if (candidate.IsAccepted != true)
                    {
                        var msg = $"Benutzer {email} wurde bisher nicht als angenommen markiert";
                        errors.Add(msg);
                        continue;
                    }


                    // so jetzt Datum und Uhrzeit Termin finden hinzufügen und/oder Termin anlegen
                    var begin = date.Add(from);
                    var end   = date.Add(until);

                    var ohDate = officeHour.Dates.SingleOrDefault(x => x.Begin == begin && x.End == end);

                    if (ohDate == null)
                    {
                        ohDate = new ActivityDate
                        {
                            Activity   = officeHour,
                            Begin      = begin,
                            End        = end,
                            Occurrence = new Occurrence
                            {
                                IsAvailable       = true,
                                Capacity          = 0,
                                FromIsRestricted  = false,
                                UntilIsRestricted = false,
                                UntilTimeSpan     = null,
                                IsCanceled        = false,
                                IsMoved           = false,
                            }
                        };

                        Db.ActivityDates.Add(ohDate);
                    }


                    // die subscription suchen
                    var ohSubDate = officeHour.Dates.FirstOrDefault(x =>
                                                                    x.Occurrence.Subscriptions.Any(s => s.UserId.Equals(candUser.Id)));

                    if (ohSubDate == null)
                    {
                        var ohSubscription = new OccurrenceSubscription
                        {
                            Occurrence    = ohDate.Occurrence,
                            OnWaitingList = false,
                            UserId        = candUser.Id,
                            TimeStamp     = DateTime.Now
                        };

                        Db.Subscriptions.Add(ohSubscription);
                    }
                    else
                    {
                        var msg = $"Benutzer {email} hat schon einen Termin am {ohSubDate.Begin}";
                        errors.Add(msg);
                        continue;
                    }
                }
            }

            if (errors.Any())
            {
                return(View("_Errors", errors));
            }

            Db.SaveChanges();

            return(RedirectToAction("Acceptance", new { id = assessment.Id }));
        }
Esempio n. 20
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.";
                        }
                    }
                }
            }
        }