Exemple #1
0
        public void SendLotteryClearedMails(LotteryDrawing drawing, OrganiserMember member)
        {
            foreach (var game in Drawing.Games)
            {
                var nNeeded = game.CoursesWanted - game.Seats.Count;

                // Versand nur an jene, die Plätze auf der Warteliste haben
                if (nNeeded > 0)
                {
                    var email = new LotteryDrawingStudentEmail("LotteryClearedStudent")
                    {
                        Subject = "[nine] Wahlverfahren " + Drawing.Lottery.Name,
                        Game    = game,
                        User    = UserService.GetUser(game.Student.UserId),
                        Drawing = drawing,
                        Member  = member
                    };

                    try
                    {
                        if (email.User != null)
                        {
                            EmailService.Send(email);
                            Logger.InfoFormat("E-Mail an {0} erfolgreich versendet", email.User.Email);
                        }
                    }
                    catch (Exception exMail)
                    {
                        Logger.ErrorFormat("Fehler bei E-Mail Versand an: {0} - Ursache {1}", email.User.Email,
                                           exMail.Message);
                    }
                }
            }
        }
Exemple #2
0
        public void SendLotteryRemoveMail(LotteryDrawing drawing, OrganiserMember member, Lottery lottery, Course course, OccurrenceSubscription subscription)
        {
            var email = new LotteryDrawingStudentEmail("LotteryRemoveStudent")
            {
                Subject      = "[nine] Wahlverfahren " + Drawing.Lottery.Name,
                Game         = null,
                User         = UserService.GetUser(subscription.UserId),
                Lottery      = lottery,
                Drawing      = drawing,
                Member       = member,
                Course       = course,
                Subscription = subscription,
            };

            try
            {
                if (email.User != null)
                {
                    EmailService.Send(email);
                    Logger.InfoFormat("E-Mail an {0} erfolgreich versendet", email.User.Email);
                }
            }
            catch (Exception exMail)
            {
                Logger.ErrorFormat("Fehler bei E-Mail Versand an: {0} - Ursache {1}", email.User.Email,
                                   exMail.Message);
            }
        }
        private OrganiserMember InitLecturer(TimeTableDbContext db, Dozent dozent, ActivityOrganiser organiser)
        {
            var n = organiser.Members.Count(l => l.ShortName.Equals(dozent.DozentID));

            if (n > 1)
            {
                return(null);
            }

            var lecturer = organiser.Members.FirstOrDefault(l => l.ShortName.Equals(dozent.DozentID));

            if (lecturer == null)
            {
                string profileUrl = null;
                if (dozent.Typ.ToUpper().Equals("PROF"))
                {
                    profileUrl = string.Format("http://wi.hm.edu/dozenten/{0}/index.de.html", dozent.Name.ToLowerInvariant());
                }

                lecturer = new OrganiserMember
                {
                    ShortName   = dozent.DozentID,
                    Name        = dozent.Name,
                    Role        = dozent.Typ,
                    Description = dozent.Name,
                    UrlProfile  = profileUrl,
                };
                organiser.Members.Add(lecturer);
                db.Members.Add(lecturer);
                db.SaveChanges();
                _numLecturers++;
            }
            return(lecturer);
        }
Exemple #4
0
        public void SendLotteryResetMails(LotteryDrawing drawing, OrganiserMember member)
        {
            // alles wird rückgesetzt => jeder bekommt eine Mail
            foreach (var game in Drawing.Games)
            {
                var email = new LotteryDrawingStudentEmail("LotteryResetStudent")
                {
                    Subject = "[nine] Wahlverfahren " + Drawing.Lottery.Name,
                    Game    = game,
                    User    = UserService.GetUser(game.Student.UserId),
                    Drawing = drawing,
                    Member  = member
                };

                try
                {
                    if (email.User != null)
                    {
                        EmailService.Send(email);
                        Logger.InfoFormat("E-Mail an {0} erfolgreich versendet", email.User.Email);
                    }
                }
                catch (Exception exMail)
                {
                    Logger.ErrorFormat("Fehler bei E-Mail Versand an: {0} - Ursache {1}", email.User.Email,
                                       exMail.Message);
                }
            }
        }
        public ActionResult DeleteConfirmed(Guid id)
        {
            OrganiserMember organiserMember = Db.Members.Find(id);

            Db.Members.Remove(organiserMember);
            Db.SaveChanges();
            return(RedirectToAction("Index"));
        }
Exemple #6
0
        /// <summary>
        /// Ermittelt die aktuellste Sprechstunde
        /// </summary>
        /// <param name="lecturer"></param>
        /// <returns></returns>
        public OfficeHour GetLatestOfficeHour(OrganiserMember lecturer)
        {
            var officeHour =
                Db.Activities.OfType <OfficeHour>().Where(x =>
                                                          x.Owners.Any(k => k.Member.Id == lecturer.Id)).OrderByDescending(x => x.Semester.StartCourses).FirstOrDefault();

            return(officeHour);
        }
 public ActionResult Edit([Bind(Include = "Id,UserId,ShortName,Name,Role,Description,IsAdmin,UrlProfile")] OrganiserMember organiserMember)
 {
     if (ModelState.IsValid)
     {
         Db.Entry(organiserMember).State = EntityState.Modified;
         Db.SaveChanges();
         return(RedirectToAction("Index"));
     }
     return(View(organiserMember));
 }
Exemple #8
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public ActionResult GetMember(Guid id)
        {
            var organiser = Db.Organisers.SingleOrDefault(org => org.Id == id);

            if (organiser == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            // Benutzer als neues Mitglied eintragen
            var user = AppUser;

            if (user == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }


            // nach dem Benutzer suchen
            var member = organiser.Members.FirstOrDefault(m => m.UserId.Equals(user.Id));

            if (member == null)
            {
                member = new OrganiserMember
                {
                    IsAdmin      = false,
                    UserId       = user.Id,
                    IsAssociated = true // "Gast"
                };

                organiser.Members.Add(member);
            }

            // Den Token generieren
            var token = System.Web.Security.Membership.GeneratePassword(8, 2);

            member.ShortName = token;

            Db.SaveChanges();

            /*
             * // Eine E-Mail senden
             * var mailModel = new OrgMemberMailModel
             * {
             *  User = user,
             *  Organiser = organiser,
             *  Token = token,
             * };
             *
             * new MailController().RegisterUnionEMail(mailModel).Deliver();
             */


            return(RedirectToAction("Index"));
        }
Exemple #9
0
        public void SendSupervisionRequest(ThesisStateModel model, OrganiserMember member, ApplicationUser user)
        {
            var email = new ThesisEmail("ThesisSupervisionRequest");

            email.Subject = "Anfrage zur Betreuung einer Abschlussarbeit";
            email.Thesis  = model;
            email.Member  = member;
            email.User    = user;

            SendThesisMail(email);
        }
Exemple #10
0
        public OfficeHour GetOfficeHour(OrganiserMember lecturer, Semester sem)
        {
            // zuerst richtg
            var officeHour =
                Db.Activities.OfType <OfficeHour>().FirstOrDefault(x =>
                                                                   x.Semester.Id == sem.Id &&
                                                                   x.Owners.Any(k => k.Member.Id == lecturer.Id)
                                                                   );

            return(officeHour);
        }
Exemple #11
0
        public void SendConditionRequestAccept(ThesisStateModel model, OrganiserMember member, ApplicationUser user)
        {
            var email = new ThesisEmail("ThesisMailTemplate");

            email.Subject = "Ihr Antrag auf Anmeldung einer Abschlussarbeit";
            email.Thesis  = model;
            email.Member  = member;
            email.User    = user;
            email.Body    = "<p><strong>Antrag wurde angenommen. Die Voraussetzungen für die Abschlussarbeit sind erfüllt.</strong></p>";

            SendThesisMail(email);
        }
        public ActionResult Create([Bind(Include = "Id,UserId,ShortName,Name,Role,Description,IsAdmin,UrlProfile")] OrganiserMember organiserMember)
        {
            if (ModelState.IsValid)
            {
                organiserMember.Id = Guid.NewGuid();
                Db.Members.Add(organiserMember);
                Db.SaveChanges();
                return(RedirectToAction("Index"));
            }

            return(View(organiserMember));
        }
Exemple #13
0
        public void SendSupervisionRequestDeny(ThesisStateModel model, OrganiserMember member, ApplicationUser user)
        {
            var email = new ThesisEmail("ThesisMailTemplate");

            email.Subject = "Ihre Anfrage zur Betreuung einer Abschlussarbeit";
            email.Thesis  = model;
            email.Member  = member;
            email.User    = user;
            email.Body    = "<p><strong>Die Betreuung Ihrer Abschlussarbeit wurde abgelehnt.</strong></p>";

            SendThesisMail(email);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public ActionResult Delete(Guid?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            OrganiserMember organiserMember = Db.Members.Find(id);

            if (organiserMember == null)
            {
                return(HttpNotFound());
            }
            return(View(organiserMember));
        }
Exemple #15
0
        public ActionResult CreateMember(MemberUserViewModel model)
        {
            var org = Db.Organisers.SingleOrDefault(m => m.Id == model.OrganiserId);

            if (org != null)
            {
                var shortName = model.ShortName.Trim().ToUpper();
                if (org.Members.Any(x => x.ShortName.ToUpper().Equals(shortName)))
                {
                    ModelState.AddModelError("", "Diesen Kurznamen gibt es schon");
                    return(View(model));
                }



                var member = new OrganiserMember
                {
                    Role         = model.Role,
                    ShortName    = model.ShortName,
                    Name         = model.Name,
                    IsAssociated = model.IsAssociated,
                };

                if (!string.IsNullOrEmpty(model.UserName))
                {
                    var user = UserManager.FindByName(model.UserName);
                    if (user != null)
                    {
                        member.UserId = user.Id;

                        // wenn es keine stud-orga ist, dann muss der Nutzer "Staff" werden
                        if (!org.IsStudent)
                        {
                            user.MemberState = MemberState.Staff;
                            UserManager.Update(user);
                        }
                    }
                }

                org.Members.Add(member);

                Db.SaveChanges();
                // Redirect zu den Members
                return(RedirectToAction("Index", "OrganiserMembers"));
            }

            return(RedirectToAction("Index", "OrganiserMembers"));
        }
Exemple #16
0
        private void DeleteMember(OrganiserMember member)
        {
            var allOwners = Db.ActivityOwners.Where(x => x.Member.Id == member.Id).ToList();

            foreach (var owner in allOwners)
            {
                Db.ActivityOwners.Remove(owner);
            }

            var org = member.Organiser;

            org.Members.Remove(member);
            Db.Members.Remove(member);

            Db.SaveChanges();
        }
Exemple #17
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="semester"></param>
        /// <param name="lecturer"></param>
        /// <returns></returns>
        public List <Course> GetCourses(Semester semester, OrganiserMember lecturer)
        {
            var list = new List <Course>();

            if (lecturer != null && semester != null)
            {
                list =
                    Db.Activities.OfType <Course>().Where(c =>
                                                          c.SemesterGroups.Any(g => g.Semester.Id == semester.Id) &&
                                                          c.Dates.Any(oc => oc.Hosts.Any(l => l.Id == lecturer.Id)))
                    .OrderBy(c => c.Name)
                    .ToList();
            }

            return(list);
        }
Exemple #18
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="lecturer"></param>
        /// <returns></returns>
        public List <CourseHistoryModel> GetCourseHistory(OrganiserMember lecturer)
        {
            var list = new List <CourseHistoryModel>();

            if (lecturer != null)
            {
                var courses =
                    Db.Activities.OfType <Course>().Where(c =>
                                                          c.Dates.Any(oc => oc.Hosts.Any(l => l.Id == lecturer.Id)))
                    .OrderBy(c => c.Name)
                    .ToList();

                var dummySemester = new Semester()
                {
                    Name = "XXX"
                };

                foreach (var course in courses)
                {
                    // Annahme alle Gruppen gehören zum selben Semester!
                    var group = course.SemesterGroups.FirstOrDefault();

                    if (group != null)
                    {
                        var summary = new CourseHistoryModel
                        {
                            Course   = course,
                            Semester = group.Semester,
                        };

                        list.Add(summary);
                    }
                    else
                    {
                        var summary = new CourseHistoryModel
                        {
                            Course   = course,
                            Semester = dummySemester,
                        };

                        list.Add(summary);
                    }
                }
            }

            return(list.OrderBy(l => l.Semester.Name).ThenBy(l => l.Course.Name).ToList());
        }
        public ActionResult CreateAdmin(MemberUserViewModel model)
        {
            var org = Db.Organisers.SingleOrDefault(m => m.Id == model.OrganiserId);

            if (org != null)
            {
                // vorhandene suchen
                var member = org.Members.SingleOrDefault(x => x.ShortName.Equals(model.ShortName));
                if (member != null)
                {
                    member.IsAdmin = true;
                    Db.SaveChanges();
                }
                else
                {
                    member = new OrganiserMember
                    {
                        ShortName = model.ShortName,
                        Name      = model.Name,
                        IsAdmin   = true,
                    };

                    if (!string.IsNullOrEmpty(model.UserName))
                    {
                        var user = UserManager.FindByName(model.UserName);
                        if (user != null)
                        {
                            member.UserId = user.Id;

                            // wenn es keine stud-orga ist, dann muss der Nutzer "Staff" werden
                            if (!org.IsStudent)
                            {
                                user.MemberState = MemberState.Staff;
                                UserManager.Update(user);
                            }
                        }
                    }

                    org.Members.Add(member);
                }


                Db.SaveChanges();
            }

            return(RedirectToAction("Details", new { id = model.OrganiserId }));
        }
Exemple #20
0
        public void SendConditionRequestDeny(ThesisStateModel model, OrganiserMember member, ApplicationUser user)
        {
            var email = new ThesisEmail("ThesisMailTemplate");

            email.Subject = "Ihr Antrag auf Anmeldung einer Abschlussarbeit";
            email.Thesis  = model;
            email.Member  = member;
            email.User    = user;

            var sb = new StringBuilder();

            sb.Append(
                "<p><strong>Antrag wurde abgelehnt. Die Voraussetzungen für die Abschlussarbeit sind NICHT erfüllt.</strong></p>");
            sb.AppendFormat("<p>Begründung:</p><p>{0}</p>", model.Thesis.RequestMessage);

            email.Body = sb.ToString();

            SendThesisMail(email);
        }
Exemple #21
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="org"></param>
        /// <param name="shortName"></param>
        /// <returns></returns>
        public OrganiserMember GetMemberByName(ActivityOrganiser org, string shortName)
        {
            var member = org.Members.SingleOrDefault(m => m.ShortName.Equals(shortName));

            if (member == null)
            {
                member = new OrganiserMember
                {
                    ShortName = shortName,
                    Name      = shortName,
                };

                Db.Members.Add(member);
                org.Members.Add(member);

                Db.SaveChanges();
            }

            return(member);
        }
Exemple #22
0
        public string GetStateMessage(OrganiserMember member)
        {
            var nSupervisors = Thesis.Supervisors.Count;
            var didIAccepted = Thesis.Supervisors.Any(x => x.Member.Id == member.Id && x.AcceptanceDate.HasValue);

            if (nSupervisors == 1)
            {
                if (didIAccepted)
                {
                    return("Arbeit angenommen");
                }

                return("Betreuungsanfrage");
            }

            var nAccepted = Thesis.Supervisors.Count(x => x.AcceptanceDate.HasValue);

            if (nAccepted == 0)
            {
                return($"Betreuungsanfrage bei {nSupervisors} Lehrenden.");
            }

            if (didIAccepted)
            {
                if (nAccepted == 1)
                {
                    return
                        ($"Arbeit wurde von mir angenommen. Von {nSupervisors - 1} Lehrenden steht die Antwort noch aus.");
                }

                return($"Arbeit wurde von mir und {nAccepted - 1} Lehrenden angenommen.");
            }

            if (nAccepted > 0)
            {
                return($"Arbeit wurde bereits von {nAccepted} Lehrenden angenommen.");
            }

            return("Betreuungsanfrage");
        }
Exemple #23
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="semesterName"></param>
        /// <param name="lecturer"></param>
        /// <returns></returns>
        public List <CourseSummaryModel> GetCourses(string semesterName, OrganiserMember lecturer)
        {
            var list     = new List <CourseSummaryModel>();
            var semester = Db.Semesters.SingleOrDefault(l => l.Name.ToUpper().Equals(semesterName.ToUpper()));

            if (lecturer != null && semester != null)
            {
                var courses =
                    Db.Activities.OfType <Course>().Where(c =>
                                                          c.SemesterGroups.Any(g => g.Semester.Id == semester.Id) &&
                                                          c.Dates.Any(oc => oc.Hosts.Any(l => l.Id == lecturer.Id)))
                    .OrderBy(c => c.Name)
                    .ToList();

                foreach (var course in courses)
                {
                    var summary = GetCourseSummary(course);
                    list.Add(summary);
                }
            }

            return(list);
        }
Exemple #24
0
        public string ImportCourse(ScheduleCourse scheduleCourse)
        {
            string msg;

            _Logger.DebugFormat("Importiere Fach: {0}", scheduleCourse.Name);
            _report.AppendFormat("<h1>Erzeuge LV \"{0} ({1})\" - [{2}]</h1>", scheduleCourse.Name, scheduleCourse.ShortName,
                                 scheduleCourse.CourseId);
            _report.AppendLine();

            var db = new TimeTableDbContext();

            var organiser = db.Organisers.SingleOrDefault(s => s.Id == _orgId);
            var sem       = db.Semesters.SingleOrDefault(s => s.Id == _semId);

            long msStart = sw.ElapsedMilliseconds;
            var  course  = new Course
            {
                ExternalSource = "JSON",
                ExternalId     = scheduleCourse.CourseId,
                Organiser      = organiser,
                ShortName      = scheduleCourse.ShortName,
                Name           = scheduleCourse.Name,
                Description    = scheduleCourse.Description,
                Occurrence     = CreateDefaultOccurrence(scheduleCourse.SeatRestriction ?? 0),
                IsInternal     = true,
            };

            // Kurs sofort speichern, damit die ID gesichert ist
            db.Activities.Add(course);
            db.SaveChanges();
            long msEnd = sw.ElapsedMilliseconds;

            _Logger.DebugFormat("Dauer: {0}ms", msEnd - msStart);
            msStart = msEnd;

            _report.AppendLine("<h2>Bezeichnungen</h2>");
            _report.AppendLine("<table>");
            _report.AppendFormat("<tr><td>Name</td><td>{0}</td></tr>", course.Name);
            _report.AppendFormat("<tr><td>Kurzname</td><td>{0}</td></tr>", course.ShortName);
            _report.AppendFormat("<tr><td>Beschreibung</td><td>{0}</td></tr>", course.Description);
            _report.AppendLine("</table>");


            // jetzt die Gruppen
            foreach (var scheduleGroup in scheduleCourse.Groups)
            {
                // Fakultät ermitteln
                var org = db.Organisers.SingleOrDefault(x => x.ShortName.Equals(scheduleGroup.FacultyName));

                // Studiengang innerhalb der Fakultät ermitteln
                var curr = org.Curricula.SingleOrDefault(x => x.ShortName.Equals(scheduleGroup.CurriculumShortName));
                if (curr == null)
                {
                    curr = new TimeTable.Data.Curriculum
                    {
                        ShortName = scheduleGroup.CurriculumShortName,
                        Name      = scheduleGroup.CurriculumName,
                        Organiser = org
                    };
                    db.Curricula.Add(curr);
                    db.SaveChanges();
                }

                // Studiengruppe innerhalb des Studiengangs ermitteln
                var groupName = scheduleGroup.GroupName;

                // Sonderlocke FK 11
                // aus der LV-Nummer das Semester raussuchen

                /* OHI 20180720: wieder ausgebaut, weil Schnittstelle jetzt sauber befüllt ist
                 * if (org.ShortName.Equals("FK 11"))
                 * {
                 *  if (!string.IsNullOrEmpty(course.ShortName))
                 *  {
                 *      groupName = course.ShortName[1].ToString();
                 *
                 *  }
                 *  else
                 *  {
                 *      groupName = "#N.V.";
                 *  }
                 * }
                 */

                var currGroup = curr.CurriculumGroups.SingleOrDefault(x => x.Name.Equals(groupName));
                if (currGroup == null)
                {
                    currGroup = new CurriculumGroup
                    {
                        Curriculum     = curr,
                        Name           = groupName,
                        IsSubscribable = true,
                    };
                    db.CurriculumGroups.Add(currGroup);
                    db.SaveChanges();
                }

                // Kapazitätsgruppe innerhalb der Studiengruppe ermitteln
                CapacityGroup capGroup = null;
                if (string.IsNullOrEmpty(scheduleGroup.SubGroupName))
                {
                    capGroup = currGroup.CapacityGroups.SingleOrDefault(x => string.IsNullOrEmpty(x.Name));
                    if (capGroup == null)
                    {
                        capGroup = new CapacityGroup
                        {
                            CurriculumGroup = currGroup,
                            Name            = string.Empty,
                            InSS            = scheduleGroup.SemesterName.StartsWith("SS"),
                            InWS            = scheduleGroup.SemesterName.StartsWith("WS")
                        };
                        db.CapacityGroups.Add(capGroup);
                        db.SaveChanges();
                    }
                }
                else
                {
                    capGroup = currGroup.CapacityGroups.SingleOrDefault(x => !string.IsNullOrEmpty(x.Name) && x.Name.Equals(scheduleGroup.SubGroupName));
                    if (capGroup == null)
                    {
                        capGroup = new CapacityGroup
                        {
                            CurriculumGroup = currGroup,
                            Name            = scheduleGroup.SubGroupName,
                            InSS            = scheduleGroup.SemesterName.StartsWith("SS"),
                            InWS            = scheduleGroup.SemesterName.StartsWith("WS")
                        };
                        db.CapacityGroups.Add(capGroup);
                        db.SaveChanges();
                    }
                }

                // Semester ermitteln
                var semester = db.Semesters.SingleOrDefault(x => x.Name.Equals(scheduleGroup.SemesterName));

                if (semester.Id == sem.Id)
                {
                    // jetzt können wir die Semestergruppe ermitteln
                    var semGroup =
                        db.SemesterGroups.SingleOrDefault(x => x.Semester.Id == semester.Id &&
                                                          x.CapacityGroup.Id == capGroup.Id);
                    if (semGroup == null)
                    {
                        semGroup = new SemesterGroup
                        {
                            Semester      = semester,
                            CapacityGroup = capGroup,
                            IsAvailable   = false // zu Beginn nicht freigegeben
                        };
                        db.SemesterGroups.Add(semGroup);
                        db.SaveChanges();
                    }

                    course.SemesterGroups.Add(semGroup);
                    semGroup.Activities.Add(course);

                    // zu jeder Semestergruppe gibt es dann noch eine
                    // Gruppe für Platzverlosung
                    var occGroup =
                        course.Occurrence.Groups.SingleOrDefault(
                            gg => gg.SemesterGroups.Any(s => s.Id == semGroup.Id));

                    if (occGroup == null)
                    {
                        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);
                    }

                    // NEU: Chapter und Topics
                    if (!string.IsNullOrEmpty(scheduleGroup.ChapterName) &&
                        !string.IsNullOrEmpty(scheduleGroup.TopicName))
                    {
                        var chapter = curr.Chapters.FirstOrDefault(x => x.Name.Equals(scheduleGroup.ChapterName));
                        if (chapter == null)
                        {
                            chapter = new CurriculumChapter
                            {
                                Curriculum = curr,
                                Name       = scheduleGroup.ChapterName
                            };
                            db.CurriculumChapters.Add(chapter);
                        }

                        var topic = chapter.Topics.FirstOrDefault(x => x.Name.Equals(scheduleGroup.TopicName));
                        if (topic == null)
                        {
                            topic = new CurriculumTopic
                            {
                                Chapter = chapter,
                                Name    = scheduleGroup.TopicName
                            };
                            db.CurriculumTopics.Add(topic);
                        }

                        var semTopic = db.SemesterTopics.FirstOrDefault(x =>
                                                                        x.Semester.Id == sem.Id && x.Topic.Id == topic.Id);

                        if (semTopic == null)
                        {
                            semTopic = new SemesterTopic
                            {
                                Semester = sem,
                                Topic    = topic,
                            };
                            db.SemesterTopics.Add(semTopic);
                        }

                        semTopic.Activities.Add(course);
                    }
                }
                // else => Semestergruppe wird nicht angelegt
            }

            db.SaveChanges();

            if (!course.SemesterGroups.Any())
            {
                _Logger.ErrorFormat("Kurs {0} ohne Gruppe", scheduleCourse.CourseId);
            }

            // zum Schluss die Termine
            _report.AppendLine("<h2>Neue Termine</h2>");
            _report.AppendLine("<table>");

            foreach (var scheduleDate in scheduleCourse.Dates)
            {
                // Der Tag
                var occDate = scheduleDate.Begin.Date;

                bool isVorlesung = true;
                foreach (var sd in _semester.Dates)
                {
                    // Wenn der Termin in eine vorlesungsfreie Zeit fällt, dann nicht importieren
                    if (sd.From.Date <= occDate.Date &&
                        occDate.Date <= sd.To.Date &&
                        sd.HasCourses == false)
                    {
                        isVorlesung = false;
                    }
                }

                if (isVorlesung)
                {
                    var occ = new ActivityDate
                    {
                        Begin      = scheduleDate.Begin,
                        End        = scheduleDate.End,
                        Activity   = course,
                        Occurrence = CreateDefaultOccurrence(),
                    };
                    _report.AppendLine("<tr>");
                    _report.AppendFormat("<td>{0}</td><td>{1}</td><td>{2}</td>", occ.Begin.ToShortDateString(), occ.Begin.ToShortTimeString(), occ.End.ToShortTimeString());

                    _report.AppendFormat("<td>");
                    foreach (var scheduleDateRoom in scheduleDate.Rooms)
                    {
                        _report.AppendFormat("<p>{0}", scheduleDateRoom.RoomNumber);
                        if (!string.IsNullOrEmpty(scheduleDateRoom.RoomNumber))
                        {
                            var room = db.Rooms.SingleOrDefault(r => r.Number.Equals(scheduleDateRoom.RoomNumber));
                            if (room == null)
                            {
                                room = new Room
                                {
                                    Number      = scheduleDateRoom.RoomNumber,
                                    Capacity    = 0,
                                    Description = string.Empty,
                                    Owner       = string.Empty,
                                };
                                db.Rooms.Add(room);
                                db.SaveChanges();

                                _numRooms++;
                                _report.AppendFormat(" !!!NEUER RAUM!!!");
                            }


                            var assignment = db.RoomAssignments.SingleOrDefault(x =>
                                                                                x.Room.Id == room.Id &&
                                                                                x.Organiser.Id == organiser.Id);
                            if (assignment == null)
                            {
                                assignment = new RoomAssignment
                                {
                                    Organiser = organiser,
                                    InternalNeedConfirmation = false, // offen für interne
                                    ExternalNeedConfirmation = true   // geschlossen für externe
                                };

                                room.Assignments.Add(assignment);
                                db.RoomAssignments.Add(assignment);
                                db.SaveChanges();
                            }

                            occ.Rooms.Add(room);
                            _report.AppendFormat("</p>");
                        }
                    }
                    _report.AppendFormat("</td>");

                    _report.AppendFormat("<td>");
                    foreach (var scheduleDateLecturer in scheduleDate.Lecturers)
                    {
                        _report.AppendFormat("<p>{0} ({1})", scheduleDateLecturer.Name, scheduleDateLecturer.ShortName);

                        var lecturer = organiser.Members.SingleOrDefault(l => l.ShortName.Equals(scheduleDateLecturer.ShortName));
                        if (lecturer == null)
                        {
                            lecturer = new OrganiserMember
                            {
                                ShortName   = scheduleDateLecturer.ShortName,
                                Name        = scheduleDateLecturer.Name,
                                Role        = String.Empty,
                                Description = String.Empty
                            };
                            organiser.Members.Add(lecturer);
                            db.Members.Add(lecturer);
                            db.SaveChanges();
                            _numLecturers++;
                            _report.AppendFormat(" !!!NEUER DOZENT!!!");
                        }

                        occ.Hosts.Add(lecturer);
                        _report.AppendFormat("</p>");
                    }
                    _report.AppendFormat("</td>");

                    db.ActivityDates.Add(occ);

                    _report.AppendLine();
                    _report.AppendLine("</tr>");
                }
            }

            _report.AppendLine("</table>");
            db.SaveChanges();

            msEnd = sw.ElapsedMilliseconds;
            _Logger.DebugFormat("Dauer {0}ms", msEnd - msStart);

            msg = $"Kurs {course.ShortName} mit Terminen importiert";

            return(msg);
        }
Exemple #25
0
 internal bool IsActive(OrganiserMember member, Semester semester)
 {
     return(Db.ActivityDates.Any(d => d.Hosts.Any(h => h.Id == member.Id) &&
                                 d.Activity.SemesterGroups.Any(s => s.Semester.Id == semester.Id)));
 }
        public string ImportCourse(CieCourse scheduleCourse)
        {
            string msg;

            _Logger.DebugFormat("Importiere Fach: {0}", scheduleCourse.name);
            _report.AppendFormat("<h1>Erzeuge LV \"{0}\" - [{1}]</h1>", scheduleCourse.name,
                                 scheduleCourse.id);
            _report.AppendLine();

            var db = new TimeTableDbContext();

            var organiser = db.Organisers.SingleOrDefault(s => s.ShortName.Equals(scheduleCourse.department));
            var sem       = db.Semesters.SingleOrDefault(s => s.Id == _semId);

            var cieSemGroup = db.SemesterGroups.SingleOrDefault(x =>
                                                                x.Semester.Id == sem.Id &&
                                                                x.CapacityGroup.CurriculumGroup.Curriculum.ShortName.Equals("CIE") &&
                                                                x.CapacityGroup.CurriculumGroup.Curriculum.ShortName.Equals("CIE") &&
                                                                x.CapacityGroup.CurriculumGroup.Name.Equals("CIE"));

            long msStart = sw.ElapsedMilliseconds;
            // suche den Kurs im bisherigen Angebot auf Grundlage des Namens
            var course = GetCourse(db, sem, organiser, scheduleCourse);

            if (course == null)
            {
                course = new Course
                {
                    ExternalSource = "CIE",
                    ExternalId     = scheduleCourse.id,
                    Organiser      = organiser,
                    ShortName      = "",
                    Name           = scheduleCourse.name,
                    Description    = scheduleCourse.description,
                    Occurrence     = CreateDefaultOccurrence(scheduleCourse.availableSlots),
                    IsInternal     = true,
                };
                // Kurs sofort speichern, damit die ID gesichert ist
                db.Activities.Add(course);
                db.SaveChanges();
            }
            long msEnd = sw.ElapsedMilliseconds;

            _Logger.DebugFormat("Dauer: {0}ms", msEnd - msStart);
            msStart = msEnd;

            _report.AppendLine("<h2>Bezeichnungen</h2>");
            _report.AppendLine("<table>");
            _report.AppendFormat("<tr><td>Name</td><td>{0}</td></tr>", course.Name);
            _report.AppendFormat("<tr><td>Kurzname</td><td>{0}</td></tr>", course.ShortName);
            _report.AppendFormat("<tr><td>Beschreibung</td><td>{0}</td></tr>", course.Description);
            _report.AppendLine("</table>");


            // jetzt die Gruppen
            // Studiengänge ermitteln
            // Den Kurs gibt es nur einmal
            // Zuordnungen pro Studiengang
            // Modul => d.h. duplizieren von ECTS, SWS
            var curricula = GetCurricula(db, sem, scheduleCourse.department, scheduleCourse.level);

            // Semestergruppe => auch hier eine "intelligente" Zuordnung
            // nur machen, wenn Kurs keine Gruppen hat
            if (!course.SemesterGroups.Any())
            {
                foreach (var curriculum in curricula)
                {
                    // Annahme: ein CIE sind immer WPM
                    var wpmCurrciculumGroup = curriculum.CurriculumGroups.SingleOrDefault(x => x.Name.Equals("WPM"));

                    var wpmCapacityGroup = wpmCurrciculumGroup.CapacityGroups.FirstOrDefault();

                    var wpmSemesterGroup = db.SemesterGroups.FirstOrDefault(x =>
                                                                            x.CapacityGroup.Id == wpmCapacityGroup.Id && x.Semester.Id == sem.Id);

                    course.SemesterGroups.Add(wpmSemesterGroup);


                    // zu jeder Semestergruppe gibt es dann noch eine
                    // Gruppe für Platzverlosung
                    var occGroup =
                        course.Occurrence.Groups.SingleOrDefault(
                            gg => gg.SemesterGroups.Any(s => s.Id == wpmSemesterGroup.Id));

                    if (occGroup == null)
                    {
                        occGroup = new OccurrenceGroup
                        {
                            Capacity            = 0,
                            FitToCurriculumOnly = true,
                            Occurrence          = course.Occurrence
                        };
                        occGroup.SemesterGroups.Add(wpmSemesterGroup);
                        wpmSemesterGroup.OccurrenceGroups.Add(occGroup);
                        course.Occurrence.Groups.Add(occGroup);
                        db.OccurrenceGroups.Add(occGroup);
                    }
                }
            }

            // Die Semestergruppe FK 13 / CIE / CIE muss immer dran
            if (!course.SemesterGroups.Contains(cieSemGroup))
            {
                course.SemesterGroups.Add(cieSemGroup);
            }
            db.SaveChanges();

            if (!course.SemesterGroups.Any())
            {
                _Logger.ErrorFormat("Kurs {0} ohne Gruppe", scheduleCourse.id);
            }

            // jetzt die Module
            // wieder pro Studiengang

            /*
             * foreach (var curriculum in curricula)
             * {
             *  //var module = GetModule(db, curriculum, scheduleCourse);
             *
             *  var nexus = new CourseModuleNexus();
             *  //nexus.Requirement = module;
             *  nexus.Course = course;
             *  // nexus.ModuleCourse = // fehlt noch
             *
             *  course.Nexus.Add(nexus);
             *
             *  db.CourseNexus.Add(nexus);
             * }
             */
            db.SaveChanges();


            // Das Ampelsystem
            if (scheduleCourse.courseStatus.Equals("RED"))
            {
                course.Occurrence.IsCoterie   = true;
                course.Occurrence.HasHomeBias = true; // Bedeutungslos
            }
            else if (scheduleCourse.courseStatus.Equals("YELLOW"))
            {
                course.Occurrence.IsCoterie   = false;
                course.Occurrence.HasHomeBias = true;
            }
            else //(scheduleCourse.courseStatus.Equals("GREEN"))
            {
                course.Occurrence.IsCoterie   = false;
                course.Occurrence.HasHomeBias = false;
            }

            db.SaveChanges();

            // zum Schluss die Termine
            // Dummy Termin mit Dozent
            _report.AppendLine("<h2>Neue Termine</h2>");
            _report.AppendLine("<table>");

            // Der Dummy Termin ist Vorlesungsbeginn 08:00-10:00
            var occDate = sem.StartCourses.Date;

            var occ = new ActivityDate
            {
                Begin      = occDate.AddHours(8),
                End        = occDate.AddHours(10),
                Activity   = course,
                Occurrence = CreateDefaultOccurrence(),
            };

            _report.AppendLine("<tr>");
            _report.AppendFormat("<td>{0}</td><td>{1}</td><td>{2}</td>", occ.Begin.ToShortDateString(), occ.Begin.ToShortTimeString(), occ.End.ToShortTimeString());

            // Kein Raum
            _report.AppendFormat("<td>");
            _report.AppendFormat("</td>");

            // Dozent => der angegebene
            var lec = scheduleCourse.lecturer.Split(',');

            _report.AppendFormat("<td>");

            foreach (var s in lec)
            {
                var scheduleDateLecturer = s.Trim();
                _report.AppendFormat("<p>{0} ({1})", scheduleDateLecturer, scheduleDateLecturer);

                var lecturer = organiser.Members.SingleOrDefault(l => l.ShortName.Equals(scheduleDateLecturer) || l.Name.Equals(scheduleDateLecturer));
                if (lecturer == null)
                {
                    lecturer = new OrganiserMember
                    {
                        ShortName   = scheduleDateLecturer,
                        Name        = scheduleDateLecturer,
                        Role        = String.Empty,
                        Description = String.Empty
                    };
                    organiser.Members.Add(lecturer);
                    db.Members.Add(lecturer);
                    db.SaveChanges();
                    _report.AppendFormat(" !!!NEUER DOZENT!!!");
                }

                occ.Hosts.Add(lecturer);
                _report.AppendFormat("</p>");
            }
            _report.AppendFormat("</td>");

            db.ActivityDates.Add(occ);

            _report.AppendLine();
            _report.AppendLine("</tr>");

            _report.AppendLine("</table>");
            db.SaveChanges();

            msEnd = sw.ElapsedMilliseconds;
            _Logger.DebugFormat("Dauer {0}ms", msEnd - msStart);

            msg = $"Kurs {course.ShortName} mit Terminen importiert";

            return(msg);
        }
Exemple #27
0
        public string ImportReservation(ScheduleCourse scheduleCourse)
        {
            string msg;

            _Logger.DebugFormat("Importiere Raumreservierung: {0}", scheduleCourse.Name);
            _report.AppendFormat("<h1>Erzeuge LV \"{0} ({1})\" - [{2}]</h1>", scheduleCourse.Name, scheduleCourse.ShortName,
                                 scheduleCourse.CourseId);
            _report.AppendLine();

            var db = new TimeTableDbContext();

            var organiser = db.Organisers.SingleOrDefault(s => s.Id == _orgId);
            var sem       = db.Semesters.SingleOrDefault(s => s.Id == _semId);

            long msStart = sw.ElapsedMilliseconds;
            var  course  = new Reservation
            {
                ExternalSource = "JSON",
                ExternalId     = scheduleCourse.CourseId,
                Organiser      = organiser,
                ShortName      = scheduleCourse.ShortName,
                Name           = scheduleCourse.Name,
                Description    = scheduleCourse.Description,
                Occurrence     = null,
                IsInternal     = true,
            };

            // Kurs sofort speichern, damit die ID gesichert ist
            db.Activities.Add(course);
            db.SaveChanges();
            long msEnd = sw.ElapsedMilliseconds;

            _Logger.DebugFormat("Dauer: {0}ms", msEnd - msStart);
            msStart = msEnd;

            _report.AppendLine("<h2>Bezeichnungen</h2>");
            _report.AppendLine("<table>");
            _report.AppendFormat("<tr><td>Name</td><td>{0}</td></tr>", course.Name);
            _report.AppendFormat("<tr><td>Kurzname</td><td>{0}</td></tr>", course.ShortName);
            _report.AppendFormat("<tr><td>Beschreibung</td><td>{0}</td></tr>", course.Description);
            _report.AppendLine("</table>");


            // jetzt die Gruppen
            // Eine Raumreservierung hat keine Gruppen

            db.SaveChanges();

            // zum Schluss die Termine
            _report.AppendLine("<h2>Neue Termine</h2>");
            _report.AppendLine("<table>");

            foreach (var scheduleDate in scheduleCourse.Dates)
            {
                // Der Tag
                var occDate = scheduleDate.Begin.Date;

                bool isVorlesung = true;
                foreach (var sd in _semester.Dates)
                {
                    // Wenn der Termin in eine vorlesungsfreie Zeit fällt, dann nicht importieren
                    if (sd.From.Date <= occDate.Date &&
                        occDate.Date <= sd.To.Date &&
                        sd.HasCourses == false)
                    {
                        isVorlesung = false;
                    }
                }

                if (isVorlesung)
                {
                    var occ = new ActivityDate
                    {
                        Begin      = scheduleDate.Begin,
                        End        = scheduleDate.End,
                        Activity   = course,
                        Occurrence = null,
                    };
                    _report.AppendLine("<tr>");
                    _report.AppendFormat("<td>{0}</td><td>{1}</td><td>{2}</td>", occ.Begin.ToShortDateString(), occ.Begin.ToShortTimeString(), occ.End.ToShortTimeString());

                    _report.AppendFormat("<td>");
                    foreach (var scheduleDateRoom in scheduleDate.Rooms)
                    {
                        _report.AppendFormat("<p>{0}", scheduleDateRoom.RoomNumber);
                        if (!string.IsNullOrEmpty(scheduleDateRoom.RoomNumber))
                        {
                            var room = db.Rooms.SingleOrDefault(r => r.Number.Equals(scheduleDateRoom.RoomNumber));
                            if (room == null)
                            {
                                room = new Room
                                {
                                    Number      = scheduleDateRoom.RoomNumber,
                                    Capacity    = 0,
                                    Description = string.Empty,
                                    Owner       = string.Empty,
                                };
                                db.Rooms.Add(room);
                                db.SaveChanges();

                                _numRooms++;
                                _report.AppendFormat(" !!!NEUER RAUM!!!");
                            }


                            var assignment = db.RoomAssignments.SingleOrDefault(x =>
                                                                                x.Room.Id == room.Id &&
                                                                                x.Organiser.Id == organiser.Id);
                            if (assignment == null)
                            {
                                assignment = new RoomAssignment
                                {
                                    Organiser = organiser,
                                    InternalNeedConfirmation = false, // offen für interne
                                    ExternalNeedConfirmation = true   // geschlossen für externe
                                };

                                room.Assignments.Add(assignment);
                                db.RoomAssignments.Add(assignment);
                                db.SaveChanges();
                            }

                            occ.Rooms.Add(room);
                            _report.AppendFormat("</p>");
                        }
                    }
                    _report.AppendFormat("</td>");

                    _report.AppendFormat("<td>");
                    foreach (var scheduleDateLecturer in scheduleDate.Lecturers)
                    {
                        _report.AppendFormat("<p>{0} ({1})", scheduleDateLecturer.Name, scheduleDateLecturer.ShortName);

                        var lecturer = organiser.Members.SingleOrDefault(l => l.ShortName.Equals(scheduleDateLecturer.ShortName));
                        if (lecturer == null)
                        {
                            lecturer = new OrganiserMember
                            {
                                ShortName   = scheduleDateLecturer.ShortName,
                                Name        = scheduleDateLecturer.Name,
                                Role        = String.Empty,
                                Description = String.Empty
                            };
                            organiser.Members.Add(lecturer);
                            db.Members.Add(lecturer);
                            db.SaveChanges();
                            _numLecturers++;
                            _report.AppendFormat(" !!!NEUER DOZENT!!!");
                        }

                        occ.Hosts.Add(lecturer);
                        _report.AppendFormat("</p>");
                    }
                    _report.AppendFormat("</td>");

                    db.ActivityDates.Add(occ);

                    _report.AppendLine();
                    _report.AppendLine("</tr>");
                }
            }

            _report.AppendLine("</table>");
            db.SaveChanges();

            msEnd = sw.ElapsedMilliseconds;
            _Logger.DebugFormat("Dauer {0}ms", msEnd - msStart);

            msg = $"Raumreservierung {course.ShortName} mit Terminen importiert";

            return(msg);
        }
Exemple #28
0
        public string UpdateCourse(Course c, ScheduleCourse scheduleCourse)
        {
            string msg;

            _Logger.DebugFormat("Aktualisiere Fach: {0}", scheduleCourse.Name);

            _report.AppendFormat("<h1>Aktualisiere LV \"{0} ({1})\" - [{2}]</h1>", scheduleCourse.Name, scheduleCourse.ShortName,
                                 scheduleCourse.CourseId);
            _report.AppendLine();

            var db = new TimeTableDbContext();

            var  organiser = db.Organisers.SingleOrDefault(s => s.Id == _orgId);
            var  sem       = db.Semesters.SingleOrDefault(s => s.Id == _semId);
            long msStart   = sw.ElapsedMilliseconds;

            var course = db.Activities.OfType <Course>().SingleOrDefault(x => x.Id == c.Id);

            // Ober sticht Unter => zuerst alle termine raus!
            _report.AppendLine("<h2>Gelöschte Termine</h2>");
            _report.AppendLine("<table>");
            foreach (var date in course.Dates.ToList())
            {
                _report.AppendLine("<tr>");
                _report.AppendFormat("<td>{0}</td><td>{1}</td><td>{2}</td>", date.Begin.ToShortDateString(), date.Begin.ToShortTimeString(), date.End.ToShortTimeString());

                _report.AppendLine("<td>");
                foreach (var room in date.Rooms)
                {
                    _report.AppendFormat("<p>{0}</p>", room.Number);
                }
                _report.AppendLine("</td>");

                _report.AppendLine("<td>");
                foreach (var host in date.Hosts)
                {
                    _report.AppendFormat("<p>{0} ({1})</p>", host.Name, host.ShortName);
                }
                _report.AppendLine("</td>");

                _report.AppendFormat("<td>{0}</td>", date.Title);
                _report.AppendFormat("<td>{0}</td>", date.Description);
                _report.AppendFormat("<td>{0}</td>", date.Occurrence.Information);

                _report.AppendLine();
                _report.AppendLine("</tr>");


                db.Occurrences.Remove(date.Occurrence);

                foreach (var change in date.Changes.ToList())
                {
                    foreach (var notificationState in change.NotificationStates.ToList())
                    {
                        db.NotificationStates.Remove(notificationState);
                        change.NotificationStates.Remove(notificationState);
                    }
                    date.Changes.Remove(change);
                    db.DateChanges.Remove(change);
                }

                course.Dates.Remove(date);

                db.ActivityDates.Remove(date);
            }
            db.SaveChanges();

            _report.AppendLine("</table>");


            // Die Bezeichnung
            _report.AppendLine("<h2>Bezeichnungen</h2>");
            _report.AppendLine("<h3>Alt</h3>");
            _report.AppendLine("<table>");
            _report.AppendFormat("<tr><td>Name</td><td>{0}</td></tr>", course.Name);
            _report.AppendFormat("<tr><td>Kurzname</td><td>{0}</td></tr>", course.ShortName);
            _report.AppendFormat("<tr><td>Beschreibung</td><td>{0}</td></tr>", course.Description);
            _report.AppendLine("</table>");

            course.Name        = scheduleCourse.Name;
            course.ShortName   = scheduleCourse.ShortName;
            course.Description = scheduleCourse.Description;

            _report.AppendLine("<h3>Neu</h3>");
            _report.AppendLine("<table>");
            _report.AppendFormat("<tr><td>Name</td><td>{0}</td></tr>", course.Name);
            _report.AppendFormat("<tr><td>Kurzname</td><td>{0}</td></tr>", course.ShortName);
            _report.AppendFormat("<tr><td>Beschreibung</td><td>{0}</td></tr>", course.Description);
            _report.AppendLine("</table>");

            // Platzkontingent
            course.Occurrence.Capacity = scheduleCourse.SeatRestriction ?? 0;

            // Termine einfügen
            // zum Schluss die Termine
            _report.AppendLine("<h2>Neue Termine</h2>");
            _report.AppendLine("<table>");

            foreach (var scheduleDate in scheduleCourse.Dates)
            {
                // Der Tag
                var occDate = scheduleDate.Begin.Date;

                bool isVorlesung = true;
                foreach (var sd in _semester.Dates)
                {
                    // Wenn der Termin in eine vorlesungsfreie Zeit fällt, dann nicht importieren
                    if (sd.From.Date <= occDate.Date &&
                        occDate.Date <= sd.To.Date &&
                        sd.HasCourses == false)
                    {
                        isVorlesung = false;
                    }
                }

                // Es muss Vorlesung sein und das Datum darf nicht existieren
                if (isVorlesung)
                {
                    var occ = new ActivityDate
                    {
                        Begin      = scheduleDate.Begin,
                        End        = scheduleDate.End,
                        Activity   = course,
                        Occurrence = CreateDefaultOccurrence(),
                    };

                    _report.AppendLine("<tr>");
                    _report.AppendFormat("<td>{0}</td><td>{1}</td><td>{2}</td>", occ.Begin.ToShortDateString(), occ.Begin.ToShortTimeString(), occ.End.ToShortTimeString());

                    _report.AppendFormat("<td>");
                    foreach (var scheduleDateRoom in scheduleDate.Rooms)
                    {
                        _report.AppendFormat("<p>{0}", scheduleDateRoom.RoomNumber);
                        if (!string.IsNullOrEmpty(scheduleDateRoom.RoomNumber))
                        {
                            var room = db.Rooms.SingleOrDefault(r => r.Number.Equals(scheduleDateRoom.RoomNumber));
                            if (room == null)
                            {
                                room = new Room
                                {
                                    Number      = scheduleDateRoom.RoomNumber,
                                    Capacity    = 0,
                                    Description = string.Empty,
                                    Owner       = string.Empty,
                                };
                                db.Rooms.Add(room);
                                db.SaveChanges();

                                _numRooms++;

                                _report.AppendFormat(" !!!NEUER RAUM!!!");
                            }


                            var assignment = db.RoomAssignments.SingleOrDefault(x =>
                                                                                x.Room.Id == room.Id &&
                                                                                x.Organiser.Id == organiser.Id);
                            if (assignment == null)
                            {
                                assignment = new RoomAssignment
                                {
                                    Organiser = organiser,
                                    InternalNeedConfirmation = false, // offen für interne
                                    ExternalNeedConfirmation = true   // geschlossen für externe
                                };

                                room.Assignments.Add(assignment);
                                db.RoomAssignments.Add(assignment);
                                db.SaveChanges();
                            }

                            occ.Rooms.Add(room);

                            _report.AppendFormat("</p>");
                        }
                    }
                    _report.AppendFormat("</td>");

                    _report.AppendFormat("<td>");
                    foreach (var scheduleDateLecturer in scheduleDate.Lecturers)
                    {
                        _report.AppendFormat("<p>{0} ({1})", scheduleDateLecturer.Name, scheduleDateLecturer.ShortName);
                        var lecturer = organiser.Members.SingleOrDefault(l => l.ShortName.Equals(scheduleDateLecturer.ShortName));
                        if (lecturer == null)
                        {
                            lecturer = new OrganiserMember
                            {
                                ShortName   = scheduleDateLecturer.ShortName,
                                Name        = scheduleDateLecturer.Name,
                                Role        = String.Empty,
                                Description = String.Empty
                            };
                            organiser.Members.Add(lecturer);
                            db.Members.Add(lecturer);
                            db.SaveChanges();
                            _numLecturers++;

                            _report.AppendFormat(" !!!NEUER DOZENT!!!");
                        }

                        occ.Hosts.Add(lecturer);

                        _report.AppendFormat("</p>");
                    }
                    _report.AppendFormat("</td>");


                    db.ActivityDates.Add(occ);

                    _report.AppendLine();
                    _report.AppendLine("</tr>");
                }
            }
            _report.AppendLine("</table>");

            db.SaveChanges();

            long msEnd = sw.ElapsedMilliseconds;

            _Logger.DebugFormat("Dauer {0}ms", msEnd - msStart);

            msg = $"Kurs {course.ShortName} mit Terminen aktualisiert";

            return(msg);
        }
Exemple #29
0
        public string GetStateMessage(OrganiserMember member)
        {
            var nSupervisors = Thesis.Supervisors.Count;
            var didIAccepted = Thesis.Supervisors.Any(x => x.Member.Id == member.Id && x.AcceptanceDate.HasValue);

            if (Thesis.IsCleared != null)
            {
                if (Thesis.IsCleared == true)
                {
                    return("abgerechnet");
                }
                else
                {
                    return("nicht abgerechnet");
                }
            }

            if (Thesis.DeliveryDate != null)
            {
                if (Thesis.GradeDate != null)
                {
                    return("Bereits bewertet");
                }

                return("Abgegeben, noch nicht bewertet");
            }


            if (nSupervisors == 1)
            {
                if (didIAccepted)
                {
                    return("Arbeit angenommen");
                }

                return("Betreuungsanfrage");
            }

            var nAccepted = Thesis.Supervisors.Count(x => x.AcceptanceDate.HasValue);

            if (nAccepted == 0)
            {
                return($"Betreuungsanfrage bei {nSupervisors} Lehrenden.");
            }

            if (didIAccepted)
            {
                if (nAccepted == 1)
                {
                    return
                        ($"Arbeit wurde von mir angenommen. Von {nSupervisors - 1} Lehrenden steht die Antwort noch aus.");
                }

                return($"Arbeit wurde von mir und {nAccepted - 1} Lehrenden angenommen.");
            }

            if (nAccepted > 0)
            {
                return($"Arbeit wurde bereits von {nAccepted} Lehrenden angenommen.");
            }

            return("Betreuungsanfrage");
        }
        /// <summary>
        /// Persönlichen Token in der DB hinterlegen
        /// </summary>
        /// <param name="lecturer"></param>
        /// <param name="semester"></param>
        /// <returns></returns>
        public ICollection <AvailableSlotModel> GetAvailabeSlots(OrganiserMember lecturer, Semester semester)
        {
            var db = new TimeTableDbContext();

            var list = new List <AvailableSlotModel>();

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

            if (officeHour == null)
            {
                return(list);
            }

            var futureDates = officeHour.Dates.Where(x => x.Begin > DateTime.Now).OrderBy(x => x.Begin).ToList();

            foreach (var date in futureDates)
            {
                if (date.Slots.Any())
                {
                    // bin ich in in einem Slot eingetragen?
                    // ja => dazufügen (Status kommt später)
                    // nein => ist noch ein Platz frei
                    foreach (var slot in date.Slots)
                    {
                        var isSubscribed = false;
                        if (isSubscribed)
                        {
                            var ohSlot = new AvailableSlotModel
                            {
                                Begin        = slot.Begin,
                                End          = slot.End,
                                OccurrenceId = slot.Occurrence.Id,
                                IsSubscribed = true
                            };
                            list.Add(ohSlot);
                        }
                        else
                        {
                            if (slot.Occurrence.Capacity < 0)
                            {
                                // keine Platzbeschränkung
                                var ohSlot = new AvailableSlotModel
                                {
                                    Begin        = slot.Begin,
                                    End          = slot.End,
                                    OccurrenceId = slot.Occurrence.Id
                                };
                                list.Add(ohSlot);
                            }
                            else if (slot.Occurrence.Subscriptions.Count < slot.Occurrence.Capacity)
                            {
                                // Platzbeschränkung mit noch freien Plätzen
                                var n = slot.Occurrence.Capacity - slot.Occurrence.Subscriptions.Count;

                                var ohSlot = new AvailableSlotModel
                                {
                                    Begin        = slot.Begin,
                                    End          = slot.End,
                                    OccurrenceId = slot.Occurrence.Id,
                                    Remark       = string.Format("Noch {0} Plätze verfügbar", n)
                                };
                                list.Add(ohSlot);
                            }
                        }
                    }
                }
                else
                {
                    var isSubscribed = false;
                    if (isSubscribed)
                    {
                        var ohSlot = new AvailableSlotModel
                        {
                            Begin        = date.Begin,
                            End          = date.End,
                            OccurrenceId = date.Occurrence.Id,
                            IsSubscribed = true
                        };
                        list.Add(ohSlot);
                    }
                    else
                    {
                        if (date.Occurrence.Capacity < 0)
                        {
                            var ohSlot = new AvailableSlotModel
                            {
                                Begin        = date.Begin,
                                End          = date.End,
                                OccurrenceId = date.Occurrence.Id
                            };
                            list.Add(ohSlot);
                        }
                        else if (date.Occurrence.Subscriptions.Count < date.Occurrence.Capacity)
                        {
                            var n = date.Occurrence.Capacity - date.Occurrence.Subscriptions.Count;

                            var ohSlot = new AvailableSlotModel
                            {
                                Begin        = date.Begin,
                                End          = date.End,
                                OccurrenceId = date.Occurrence.Id,
                                Remark       = string.Format("Noch {0} Plätze verfügbar", n)
                            };
                            list.Add(ohSlot);
                        }
                    }
                }
            }



            return(list);
        }