示例#1
0
        /// <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);
        }
示例#2
0
        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));
        }
示例#3
0
        /// <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);
        }
示例#4
0
        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);
        }
示例#5
0
        // 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));
        }