Esempio n. 1
0
        private OfficeHour GetOfficeHour(Assessment assessment)
        {
            var ohName = $"Eignungsgespräche {assessment.Name}";

            var oh = Db.Activities.OfType <OfficeHour>().FirstOrDefault(x => x.Name.Equals(ohName));

            if (oh != null)
            {
                return(oh);
            }

            // Neue Sprechstunde anlegen
            // Alle Kommittee-Mitglieder werden zu Ownern
            oh = new OfficeHour
            {
                Name                = ohName,
                Semester            = assessment.Semester,
                IsInternal          = true,
                FutureSubscriptions = 1,
                Description         = "Eignungsgespräche",
                Organiser           = assessment.Curriculum.Organiser,
                Occurrence          = new Occurrence
                {
                    IsAvailable       = true,
                    Capacity          = 4,
                    FromIsRestricted  = false,
                    UntilIsRestricted = false,
                    UntilTimeSpan     = null,
                    IsCanceled        = false,
                    IsMoved           = false,
                }
            };

            foreach (var committeeMember in assessment.Committee.Members)
            {
                ActivityOwner owner = new ActivityOwner
                {
                    Activity = oh,
                    Member   = committeeMember.Member,
                    IsLocked = false
                };

                oh.Owners.Add(owner);
                Db.ActivityOwners.Add(owner);
            }


            Db.Activities.Add(oh);
            Db.SaveChanges();

            return(oh);
        }
Esempio n. 2
0
        public OfficeHour CreateOfficeHour(OfficeHourCreateRequest request)
        {
            var db = new TimeTableDbContext();

            var organizer = db.Organisers.SingleOrDefault(o => o.Id == request.OrgId);

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

            var lecturer = organizer.Members.SingleOrDefault(l => l.Id == request.DozId);

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

            var semester = db.Semesters.SingleOrDefault(s => s.Id == request.SemesterId);

            var officeHour = db.Activities.OfType <OfficeHour>()
                             .SingleOrDefault(oh => oh.Semester.Id == semester.Id &&
                                              oh.Dates.Any(oc => oc.Hosts.Any(l => l.Id == lecturer.Id)));

            if (officeHour == null)
            {
                officeHour = new OfficeHour
                {
                    Name                = "Sprechstunde",
                    ShortName           = lecturer.ShortName,
                    ByAgreement         = request.ByAgreement,
                    Description         = request.Text,
                    Organiser           = organizer,
                    Semester            = semester,
                    SlotsPerDate        = request.SlotsPerDate,
                    FutureSubscriptions = request.FutureSlots,
                    Occurrence          = new Occurrence
                    {
                        IsAvailable       = true,
                        Capacity          = request.SlotDuration > 0 ? -1 : request.Capacity,
                        FromIsRestricted  = false,
                        UntilIsRestricted = (request.SubscriptionLimit > 0),
                        UntilTimeSpan     =
                            (request.SubscriptionLimit > 0)
                                ? new TimeSpan(request.SubscriptionLimit - 1, 59, 0)
                                : new TimeSpan?(),
                        IsCanceled = false,
                        IsMoved    = false,
                    }
                };

                // den Anbieter als Owner eintragen, aber nur wenn er noch nicht drin ist
                if (officeHour.Owners.All(x => x.Member.Id != lecturer.Id))
                {
                    ActivityOwner owner = new ActivityOwner
                    {
                        Activity = officeHour,
                        Member   = lecturer,
                        IsLocked = false
                    };

                    officeHour.Owners.Add(owner);
                    db.ActivityOwners.Add(owner);
                }


                db.Activities.Add(officeHour);
                db.SaveChanges();
            }

            if (request.CreateDates)
            {
                var semesterService = new SemesterService();
                var dates           = semesterService.GetDays(request.SemesterId, request.DayOfWeek, semester.StartCourses, request.LastDate);

                foreach (var dateTime in dates)
                {
                    var ocStart = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, request.StartTime.Hours,
                                               request.StartTime.Minutes, request.StartTime.Seconds);
                    var ocEnd = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, request.EndTime.Hours,
                                             request.EndTime.Minutes, request.EndTime.Seconds);

                    var occurrence = new ActivityDate
                    {
                        Begin    = ocStart,
                        End      = ocEnd,
                        Activity = officeHour,
                        Hosts    = new HashSet <OrganiserMember>
                        {
                            lecturer,
                        },
                        Occurrence = new Occurrence
                        {
                            IsAvailable       = true,
                            Capacity          = request.SlotDuration > 0 ? -1 : request.Capacity,
                            FromIsRestricted  = false,
                            UntilIsRestricted = (request.SubscriptionLimit > 0),
                            UntilTimeSpan     =
                                (request.SubscriptionLimit > 0)
                                    ? new TimeSpan(request.SubscriptionLimit - 1, 59, 0)
                                    : new TimeSpan?(),
                            IsCanceled = false,
                            IsMoved    = false,
                        }
                    };

                    // Slots
                    if (request.SlotDuration > 0)
                    {
                        var ohDuration = request.EndTime - request.StartTime;

                        var numSlots = (int)(ohDuration.TotalMinutes / request.SlotDuration + 0.01);


                        for (int i = 1; i <= numSlots; i++)
                        {
                            var slotStart = ocStart.AddMinutes((i - 1) * request.SlotDuration);
                            var slotEnd   = ocStart.AddMinutes(i * request.SlotDuration);

                            // i-ter Slot
                            var available = true;
                            if (request.SpareSlots == -99)
                            {
                                available = (i > 1 && i < numSlots);
                            }
                            else
                            {
                                if (request.SpareSlots < 0) // Anzahl vom Ende her
                                {
                                    available = (i <= numSlots + request.SpareSlots);
                                }
                                else if (request.SpareSlots > 0) // Anzahl vom Anfang
                                {
                                    available = (i > request.SpareSlots);
                                }
                            }


                            var slot = new ActivitySlot
                            {
                                Begin      = slotStart,
                                End        = slotEnd,
                                Occurrence = new Occurrence
                                {
                                    IsAvailable       = available,
                                    Capacity          = request.Capacity,
                                    FromIsRestricted  = false, // Zeitrestriktionen nur auf dem Activity Date
                                    UntilIsRestricted = false,
                                    IsCanceled        = false,
                                    IsMoved           = false,
                                }
                            };

                            occurrence.Slots.Add(slot);
                        }
                    }

                    officeHour.Dates.Add(occurrence);
                }

                db.SaveChanges();
            }

            return(officeHour);
        }
        public ActionResult Issue(ThesisIssueModel model)
        {
            // was muss angelegt werden

            // aus dem Benutzernamen den User suchen
            var user = UserManager.FindByName(model.UserName);

            if (user == null)
            {
                ModelState.AddModelError("UserName", "Benutzer existiert nicht");
                return(View(model));
            }

            var issueDate = DateTime.Parse(model.IssueDate);

            if (issueDate < DateTime.Today)
            {
                ModelState.AddModelError("IssueDate", "Ausgabedatum darf nicht in der Vergangenheit liegen");
                return(View(model));
            }

            // jetzt alles anlegen
            var member = GetMyMembership();

            // den Studenten suchen
            var student = Db.Students.SingleOrDefault(x => x.UserId.Equals(user.Id));

            if (student == null)
            {
                student        = new Student();
                student.UserId = user.Id;
            }

            // Die Prüfung finden
            var semester = SemesterService.GetSemester(DateTime.Today);

            // das Exam finden => das ist die Aktivität
            // gibt es bei mir schon ein Exam mit diesem Studierenden als Prüfling?
            var exam = Db.Activities.OfType <Exam>().SingleOrDefault(x => x.Owners.Any(y => y.Member.Id == member.Id) && x.StudentExams.Any(y => y.Examinee.Id == student.Id));

            if (exam == null)
            {
                var owner = new ActivityOwner
                {
                    Member   = member,
                    IsLocked = false
                };

                exam = new Exam
                {
                    Name      = "Abschlussarbeit",
                    ShortName = "AA",
                    Semester  = semester
                };
                exam.Owners.Add(owner);

                Db.ActivityOwners.Add(owner);
                Db.Activities.Add(exam);

                // ein StudentExam bauen
                var studentExam = new StudentExam();
                studentExam.Examinee = student;

                exam.StudentExams.Add(studentExam);

                Db.SaveChanges();
            }



            return(RedirectToAction("Index"));
        }
Esempio n. 4
0
        public ActionResult CreateThesis(CourseCreateModelExtended model)
        {
            var org      = GetMyOrganisation();
            var semester = SemesterService.GetSemester(model.SemesterId);

            var course = new Exam
            {
                Name       = model.Name,
                ShortName  = model.ShortName,
                Organiser  = org,
                Occurrence = new Occurrence
                {
                    Capacity          = -1,
                    IsAvailable       = true,
                    FromIsRestricted  = false,
                    UntilIsRestricted = false,
                    IsCanceled        = false,
                    IsMoved           = false,
                    UseGroups         = false,
                },
            };

            // da kommen Kapazitätsgruppen
            // d.h. Semestergruppe suchen und ggf. anlegen
            if (model.GroupIds != null)
            {
                foreach (var groupId in model.GroupIds)
                {
                    var capGroup = Db.CapacityGroups.SingleOrDefault(g => g.Id == groupId);

                    var semGroup =
                        Db.SemesterGroups.SingleOrDefault(
                            g => g.Semester.Id == semester.Id && g.CapacityGroup.Id == groupId);

                    // die Semestergruppe gibt es nicht => anlegen
                    if (semGroup == null)
                    {
                        semGroup = new SemesterGroup
                        {
                            CapacityGroup = capGroup,
                            Semester      = semester,
                            IsAvailable   = false,
                        };
                        Db.SemesterGroups.Add(semGroup);
                    }
                    course.SemesterGroups.Add(semGroup);

                    var occGroup = new OccurrenceGroup
                    {
                        Capacity            = 0,
                        FitToCurriculumOnly = true,
                        Occurrence          = course.Occurrence
                    };
                    occGroup.SemesterGroups.Add(semGroup);
                    semGroup.OccurrenceGroups.Add(occGroup);
                    course.Occurrence.Groups.Add(occGroup);
                    Db.OccurrenceGroups.Add(occGroup);
                }
            }



            var member = GetMyMembership();

            if (member != null)
            {
                // das Objeklt muss aus dem gleichen Kontext kommen
                var me = Db.Members.SingleOrDefault(m => m.Id == member.Id);

                ActivityOwner owner = new ActivityOwner
                {
                    Activity = course,
                    Member   = me,
                    IsLocked = false
                };

                course.Owners.Add(owner);
                Db.ActivityOwners.Add(owner);
            }


            Db.Activities.Add(course);
            Db.SaveChanges();

            return(PartialView("_CreateThesisSuccess", course));
        }
Esempio n. 5
0
        public ActionResult CreateEvent(CourseCreateModelExtended model)
        {
            Init(null);
            var user = GetCurrentUser();

            var org = _union;

            var @event = new Event
            {
                Name        = model.Name,
                ShortName   = model.ShortName,
                Description = model.Description,
                Organiser   = org,
                Occurrence  = new Occurrence
                {
                    Capacity          = -1,
                    IsAvailable       = true,
                    FromIsRestricted  = false,
                    UntilIsRestricted = false,
                    IsCanceled        = false,
                    IsMoved           = false,
                    UseGroups         = false,
                },
            };

            if (model.GroupIds != null)
            {
                foreach (var groupId in model.GroupIds)
                {
                    var semGroup = Db.SemesterGroups.SingleOrDefault(g => g.Id == groupId);

                    if (semGroup != null)
                    {
                        @event.SemesterGroups.Add(semGroup);

                        var occGroup = new OccurrenceGroup
                        {
                            Capacity            = 0,
                            FitToCurriculumOnly = true,
                            Occurrence          = @event.Occurrence
                        };
                        occGroup.SemesterGroups.Add(semGroup);
                        semGroup.OccurrenceGroups.Add(occGroup);
                        @event.Occurrence.Groups.Add(occGroup);
                        Db.OccurrenceGroups.Add(occGroup);
                    }
                }
            }

            var member = GetMember(user.UserName, _union.ShortName);

            if (member != null)
            {
                // das Objeklt muss aus dem gleichen Kontext kommen
                var me = Db.Members.SingleOrDefault(m => m.Id == member.Id);

                ActivityOwner owner = new ActivityOwner
                {
                    Activity = @event,
                    Member   = me,
                    IsLocked = false
                };

                @event.Owners.Add(owner);
                Db.ActivityOwners.Add(owner);
            }

            var dozList = new List <OrganiserMember>();

            if (model.DozIds != null)
            {
                dozList.AddRange(model.DozIds.Select(dozId => Db.Members.SingleOrDefault(g => g.Id == dozId)).Where(doz => doz != null));
            }

            var roomList = new List <Room>();

            if (model.RoomIds != null)
            {
                roomList.AddRange(model.RoomIds.Select(roomId => Db.Rooms.SingleOrDefault(g => g.Id == roomId)).Where(doz => doz != null));
            }

            // Termine anelegen
            var semesterService = new SemesterService();

            if (model.Dates != null)
            {
                foreach (var date in model.Dates)
                {
                    string[] elems = date.Split('#');
                    var      day   = DateTime.Parse(elems[0]);
                    var      begin = TimeSpan.Parse(elems[1]);
                    var      end   = TimeSpan.Parse(elems[2]);
                    var      isWdh = bool.Parse(elems[3]);

                    ICollection <DateTime> dayList;
                    var semester = semesterService.GetSemester(day);

                    if (isWdh && semester != null)
                    {
                        dayList = semesterService.GetDays(semester.Id, day);
                    }
                    else
                    {
                        dayList = new List <DateTime> {
                            day
                        };
                    }


                    foreach (var dateDay in dayList)
                    {
                        var activityDate = new ActivityDate
                        {
                            Activity   = @event,
                            Begin      = dateDay.Add(begin),
                            End        = dateDay.Add(end),
                            Occurrence = new Occurrence
                            {
                                Capacity          = -1,
                                IsAvailable       = true,
                                FromIsRestricted  = false,
                                UntilIsRestricted = false,
                                IsCanceled        = false,
                                IsMoved           = false,
                                UseGroups         = false,
                            },
                        };

                        foreach (var room in roomList)
                        {
                            activityDate.Rooms.Add(room);
                        }

                        foreach (var doz in dozList)
                        {
                            activityDate.Hosts.Add(doz);
                        }

                        Db.ActivityDates.Add(activityDate);
                    }
                }
            }


            Db.Activities.Add(@event);
            Db.SaveChanges();


            return(PartialView("_CreateEventSuccess", @event));
        }