/// <summary> /// Liste aller Termine aus Sicht eines Users /// </summary> /// <param name="officeHour"></param> /// <param name="userId"></param> internal ICollection <OfficeHourDateViewModel> GetDates(OfficeHour officeHour, string userId) { var allDates = officeHour.Dates.OrderBy(x => x.Begin).ToList(); var model = new List <OfficeHourDateViewModel>(); foreach (var date in allDates) { var dateModel = new OfficeHourDateViewModel(); dateModel.OfficeHour = officeHour; dateModel.Date = date; // Weiche Slots / kein Slots if (date.Slots.Any()) { // bin ich im Slot eingetragen? var slot = date.Slots.FirstOrDefault(x => x.Occurrence.Subscriptions.Any(s => s.UserId.Equals(userId))); if (slot != null) { dateModel.Slot = slot; dateModel.Subscription = slot.Occurrence.Subscriptions.FirstOrDefault(x => x.UserId.Equals(userId)); } } else { dateModel.Subscription = date.Occurrence.Subscriptions.FirstOrDefault(x => x.UserId.Equals(userId)); } // Ergebnisse // bin eingetragen (ja/nein) => ist über die Subscription gekennzeichnet // darf mich eintragen (ja/nein) // Ende der Einschreibeperiode dateModel.EndOfSubscriptionPeriod = DateTime.MaxValue; if (date.Occurrence.UntilIsRestricted && date.Occurrence.UntilTimeSpan.HasValue) { dateModel.EndOfSubscriptionPeriod = date.Begin.AddHours(-date.Occurrence.UntilTimeSpan.Value.Hours) .AddMinutes(-date.Occurrence.UntilTimeSpan.Value.Minutes); } // ja // Liste der verfügbaren Slots bzw. Plätze if (date.Slots.Any()) { dateModel.AvailableSlots.AddRange(date.Slots.Where(x => x.Occurrence.Subscriptions.Count == 0 && x.Occurrence.IsAvailable)); } else { dateModel.AvailableSeats = date.Occurrence.Capacity <= 0 ? 1 : date.Occurrence.Capacity - date.Occurrence.Subscriptions.Count; } model.Add(dateModel); } return(model); }
public ActionResult DateDetails(Guid id) { var date = Db.ActivityDates.SingleOrDefault(x => x.Id == id); var officeHour = date.Activity as OfficeHour; var infoService = new OfficeHourInfoService(UserManager); var model = new OfficeHourDateViewModel(); model.OfficeHour = officeHour; model.Date = date; model.Subscriptions.AddRange(infoService.GetSubscriptions(date)); return(View(model)); }
/// <summary> /// Liste aller Termine aus Sicht eines Users /// </summary> /// <param name="officeHour"></param> internal ICollection <OfficeHourDateViewModel> GetDates(OfficeHour officeHour) { var allDates = officeHour.Dates.OrderBy(x => x.Begin).ToList(); var model = new List <OfficeHourDateViewModel>(); var now = DateTime.Now; foreach (var date in allDates) { var dateModel = new OfficeHourDateViewModel(); dateModel.OfficeHour = officeHour; dateModel.Date = date; // Ende der Einschreibeperiode dateModel.EndOfSubscriptionPeriod = DateTime.MaxValue; if (date.Occurrence.UntilIsRestricted && date.Occurrence.UntilTimeSpan.HasValue) { dateModel.EndOfSubscriptionPeriod = date.Begin.AddHours(-date.Occurrence.UntilTimeSpan.Value.Hours) .AddMinutes(-date.Occurrence.UntilTimeSpan.Value.Minutes); } // ja // Liste der verfügbaren Slots bzw. Plätze if (date.Slots.Any()) { dateModel.AvailableSlots.AddRange(date.Slots.Where(x => x.Occurrence.Subscriptions.Count == 0 && x.Occurrence.IsAvailable)); foreach (var slot in date.Slots) { dateModel.Subscriptions.AddRange(slot.Occurrence.Subscriptions); } } else { dateModel.AvailableSeats = date.Occurrence.Capacity <= 0 ? 1 : date.Occurrence.Capacity - date.Occurrence.Subscriptions.Count; dateModel.Subscriptions.AddRange(date.Occurrence.Subscriptions); } model.Add(dateModel); } return(model); }
internal OfficeHourDateViewModel GetNextSubscription(OfficeHour officeHour, string userId) { OfficeHourDateViewModel ohm = new OfficeHourDateViewModel(); DateTime x = DateTime.Now; // das nächste Datum var nextDate = officeHour.Dates.Where(d => d.Begin >= x && // in der Zukunft (d.Occurrence.Subscriptions.Any(s => s.UserId.Equals(userId)) || // im Date eingeschrieben d.Slots.Any(slot => slot.Occurrence.Subscriptions.Any(s => s.UserId.Equals(userId))))) // in irgendeinem Slot eingeschrieben .OrderBy(d => d.Begin) .FirstOrDefault(); if (nextDate != null) { ohm.Date = nextDate; ohm.Lecturer = nextDate.Hosts.FirstOrDefault(); // noch schauen, ob es eine Eintragung in einem Slot ist var nextSlot = nextDate.Slots.Where(slot => slot.Occurrence.Subscriptions.Any(s => s.UserId.Equals(userId))) .OrderBy(d => d.Begin) .FirstOrDefault(); ohm.Slot = nextSlot; } else { var firstDate = officeHour.Dates.FirstOrDefault(); if (firstDate != null) { ohm.Lecturer = firstDate.Hosts.FirstOrDefault(); } } ohm.OfficeHour = officeHour; return(ohm); }
// GET: Studies public ActionResult Index(Guid?id) { // den Benutzer var user = GetCurrentUser(); var student = GetCurrentStudent(user.Id); var cand = Db.Candidatures.Where(x => x.UserId.Equals(user.Id)).ToList(); var meberships = MemberService.GetFacultyMemberships(user.Id); if (student == null) { if (cand.Any()) { // kein Student, aber laufende Aufnahmeverfahren return(RedirectToAction("Index", "Candidature")); } if (meberships.Any()) { return(RedirectToAction("Curricula", "Subscription")); } // kein Student und auch keine laufenden Aufnahmeverfahren return(RedirectToAction("Index", "Home")); } // das aktuelle Semester der Organisation Semester semester = null; Semester prevSemester = null; Semester nextSemester = null; if (id == null) { semester = GetLatestSemester(student.Curriculum.Organiser); } else { semester = SemesterService.GetSemester(id); } prevSemester = SemesterService.GetPreviousSemester(semester); nextSemester = SemesterService.GetNextSemester(semester); var model = new StudentSummaryModel { Student = student, Semester = semester, PrevSemester = prevSemester, NextSemester = nextSemester, Lecturers = new List <StudentLecturerViewModel>() }; model.Thesis = Db.Theses.FirstOrDefault(x => x.Student.Id == student.Id); // Alle gebuchten Lehrveranstaltungen var courseService = new CourseService(Db); model.Courses = new List <CourseSummaryModel>(); var courses = Db.Activities.OfType <Course>().Where(a => a.SemesterGroups.Any(g => g.Semester.Id == semester.Id) && a.Occurrence.Subscriptions.Any(u => u.UserId.Equals(user.Id))).ToList(); foreach (var course in courses) { var summary = courseService.GetCourseSummary(course); model.Courses.Add(summary); var state = ActivityService.GetActivityState(course.Occurrence, user); summary.User = user; summary.Subscription = state.Subscription; summary.Lottery = Db.Lotteries.FirstOrDefault(x => x.Occurrences.Any(y => y.Id == course.Occurrence.Id)); // foreach (var lecturer in summary.Lecturers) { var studentLecturer = model.Lecturers.SingleOrDefault(x => x.Lecturer.Id == lecturer.Id); if (studentLecturer == null) { studentLecturer = new StudentLecturerViewModel { Lecturer = lecturer, Courses = new List <CourseSummaryModel>(), OfficeHours = new List <OfficeHourDateViewModel>() }; model.Lecturers.Add(studentLecturer); } studentLecturer.Courses.Add(summary); } } // Alle gebuchten Sprechstundentermine in der Zukunft (Ende muss in Zukunft liegen) var myOfficeHours = Db.Activities.OfType <OfficeHour>().Where(x => x.Semester != null && x.Dates.Any(d => d.End >= DateTime.Now && ( d.Occurrence.Subscriptions.Any(s => s.UserId.Equals(user.Id)) || d.Slots.Any(s => s.Occurrence.Subscriptions.Any(g => g.UserId.Equals(user.Id)))))) .ToList(); foreach (var officeHour in myOfficeHours) { var lecturer = officeHour.Owners.First().Member; var studentLecturer = model.Lecturers.SingleOrDefault(x => x.Lecturer.Id == lecturer.Id); if (studentLecturer == null) { studentLecturer = new StudentLecturerViewModel { Lecturer = lecturer, Courses = new List <CourseSummaryModel>(), OfficeHours = new List <OfficeHourDateViewModel>() }; model.Lecturers.Add(studentLecturer); } var dates = officeHour.Dates.Where(d => d.Occurrence.Subscriptions.Any(s => s.UserId.Equals(user.Id))) .ToList(); foreach (var date in dates) { var ohDate = new OfficeHourDateViewModel(); ohDate.OfficeHour = officeHour; ohDate.Date = date; ohDate.Lecturer = officeHour.Owners.First().Member; ohDate.Subscription = date.Occurrence.Subscriptions.FirstOrDefault(x => x.UserId.Equals(user.Id)); studentLecturer.OfficeHours.Add(ohDate); } // alle slots dates = officeHour.Dates.Where(d => d.Slots.Any(s => s.Occurrence.Subscriptions.Any(g => g.UserId.Equals(user.Id)))) .ToList(); foreach (var date in dates) { var slots = date.Slots.Where(d => d.Occurrence.Subscriptions.Any(s => s.UserId.Equals(user.Id))) .ToList(); foreach (var slot in slots) { var ohDate = new OfficeHourDateViewModel(); ohDate.OfficeHour = officeHour; ohDate.Date = date; ohDate.Slot = slot; ohDate.Lecturer = officeHour.Owners.First().Member; ohDate.Subscription = slot.Occurrence.Subscriptions.FirstOrDefault(x => x.UserId.Equals(user.Id)); studentLecturer.OfficeHours.Add(ohDate); } } } return(View(model)); }