Пример #1
0
        public CourseSelectModel GetCourseSelectModel(Guid id, string userId)
        {
            var model = new CourseSelectModel();

            var summary = GetCourseSummary(id);

            model.Summary = summary;

            if (!string.IsNullOrEmpty(userId))
            {
                var studentService = new StudentService(Db);
                var student        = studentService.GetCurrentStudent(userId);

                var subscriptionService = new SubscriptionService(Db);
                var subscription        = subscriptionService.GetSubscription(summary.Course.Occurrence.Id, userId);

                var bookingService = new BookingService(Db);
                var bookingLists   = bookingService.GetBookingLists(summary.Course.Occurrence.Id);

                var bookingState = new BookingState();
                bookingState.Occurrence   = summary.Course.Occurrence;
                bookingState.Student      = student;
                bookingState.BookingLists = bookingLists;
                bookingState.Init();

                if (summary.Course.Dates.Any())
                {
                    var firstDate  = summary.Course.Dates.Min(x => x.Begin);
                    var lastDate   = summary.Course.Dates.Max(x => x.End);
                    var activities = Db.Activities.OfType <Course>()
                                     .Where(x => x.Occurrence.Subscriptions.Any(s => s.UserId.Equals(userId)) &&
                                            x.Dates.Any(d => d.End >= firstDate && d.Begin <= lastDate)
                                            ).ToList();

                    model.Summary.ConflictingDates = GetConflictingDates(summary.Course, activities);
                }

                model.Student      = student;
                model.BookingState = bookingState;
                model.Subscription = subscription;

                summary.Subscription = subscription;
            }

            return(model);
        }
Пример #2
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));
        }
Пример #3
0
        private CourseSelectModel GetBookingStateModel(Guid id)
        {
            var user = GetCurrentUser();

            var student = StudentService.GetCurrentStudent(user.Id);

            var courseService = new CourseService(Db);

            var courseSummary = courseService.GetCourseSummary(id);

            var bookingService = new BookingService(Db);

            var bookingLists = bookingService.GetBookingLists(courseSummary.Course.Occurrence.Id);

            var subscriptionService = new SubscriptionService(Db);

            var subscription = subscriptionService.GetSubscription(courseSummary.Course.Occurrence.Id, user.Id);

            // Konflikte suchen
            if (Request.IsAuthenticated)
            {
                var firstDate = courseSummary.Course.Dates.Min(x => x.Begin);
                var lastDate  = courseSummary.Course.Dates.Max(x => x.Begin);

                var activities = Db.Activities.OfType <Course>().Where(a =>
                                                                       a.Occurrence.Subscriptions.Any(u => u.UserId.Equals(user.Id)) &&
                                                                       a.Dates.Any(d => d.Begin >= firstDate && d.End <= lastDate)).ToList();

                courseSummary.ConflictingDates = courseService.GetConflictingDates(courseSummary.Course, activities);

                /*
                 * foreach (var date in courseSummary.Course.Dates)
                 * {
                 *  var conflictingActivities = activities.Where(x =>
                 *      x.Id != courseSummary.Course.Id &&
                 *      x.Dates.Any(d =>
                 *          (d.End > date.Begin && d.End <= date.End) || // Veranstaltung endet im Zeitraum
                 *          (d.Begin >= date.Begin && d.Begin < date.End) || // Veranstaltung beginnt im Zeitraum
                 *          (d.Begin <= date.Begin &&
                 *           d.End >= date.End) // Veranstaltung zieht sich über gesamten Zeitraum
                 *  )).ToList();
                 *
                 *  courseSummary.ConflictingDates[date] = new List<ActivityDate>();
                 *
                 *  foreach (var conflictingActivity in conflictingActivities)
                 *  {
                 *      var conflictingDates = conflictingActivity.Dates.Where(d =>
                 *              (d.End > date.Begin && d.End <= date.End) || // Veranstaltung endet im Zeitraum
                 *              (d.Begin >= date.Begin &&
                 *               d.Begin < date.End) || // Veranstaltung beginnt im Zeitraum
                 *              (d.Begin <= date.Begin &&
                 *               d.End >= date.End) // Veranstaltung zieht sich über gesamten Zeitraum
                 *      ).ToList();
                 *      courseSummary.ConflictingDates[date].AddRange(conflictingDates);
                 *  }
                 * }
                 */
            }

            var bookingState = new BookingState
            {
                Student      = student,
                Occurrence   = courseSummary.Course.Occurrence,
                BookingLists = bookingLists
            };

            bookingState.Init();

            var model = new CourseSelectModel
            {
                User         = user,
                Student      = student,
                Summary      = courseSummary,
                BookingState = bookingState,
                Subscription = subscription,
            };

            return(model);
        }