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); }
/// <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)); }
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); }