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