public PartialViewResult SubscribeActivity(Guid Id) { //Db.Database.BeginTransaction() var activity = Db.Occurrences.SingleOrDefault(ac => ac.Id == Id); var model = new OccurrenceStateModel(); if (activity != null) { model.Occurrence = activity; var userProfile = UserManager.FindByName(User.Identity.Name); var occService = new OccurrenceService(UserManager); var msg = occService.SubscribeOccurrence(activity.Id, userProfile); model.HasError = msg.HasError; model.ErrorMessage = msg.Message; model.Subscription = msg.Subscription; var logger = LogManager.GetLogger("SubscribeActivity"); var ac = new ActivityService(); var summary = ac.GetSummary(Id); if (msg.HasError) { logger.InfoFormat("{0} ({1}) by [{2}]: {3}", summary.Activity.Name, summary.Activity.ShortName, User.Identity.Name, msg.Message); } else { logger.InfoFormat("{0} ({1}) by [{2}]", summary.Activity.Name, summary.Activity.ShortName, User.Identity.Name); } if (new SystemConfig().MailSubscriptionEnabled) { var mailModel = new SubscriptionMailModel { Summary = summary, Subscription = model.Subscription, User = userProfile, }; var mail = new MailController(); mail.Subscription(mailModel).Deliver(); } } return(PartialView("_SubscriptionState", model)); }
/// <summary> /// Ermittelt den Eintragungsstatus eines Benutzers /// </summary> /// <param name="occurrence"></param> /// <param name="user"></param> /// <returns>Der Benutzer ist bereits eingetragen, es ist eine Eintragung möglich. Wenn keine Eintragung möglich, dann wird es als Fehler angegeben (mit Grund).</returns> public OccurrenceStateModel GetActivityState(Occurrence occurrence, ApplicationUser user) { var state = new OccurrenceStateModel(); state.Occurrence = occurrence; if (user == null) { // Benutzer unbekannt return(state); } // Anmerkung: FirstOrDefault ist hier besser, da im Augenblick noch nicht verhindert werden kann // dass es doppelte Eintragungen gibt // TODO: auf SingleOrDefault umstellen state.Subscription = occurrence.Subscriptions.FirstOrDefault(s => s.UserId.Equals(user.Id)); var summary = GetSummary(occurrence.Id); // wenn es eine Einschreibung gibt, dann nicht weitermachen // Ausnahme: bei Sprechstunden darf man sich nach dem Ende der Eintragungsfrist bzw. // nach Beginn des Termins nicht mehr austragen if (state.Subscription != null) { if (summary.Activity is OfficeHour) { // den State einfügen if (summary is ActivityDateSummary) { var dateSummary = summary as ActivityDateSummary; state.State = GetSubscriptionState(occurrence, dateSummary.Date.Begin, dateSummary.Date.End); } else if (summary is ActivitySlotSummary) { // wenn es ein Slot ist, dann stecken die Rahmenbedingungen trotzdem im Termin var slotSummary = summary as ActivitySlotSummary; state.State = GetSubscriptionState(slotSummary.Slot.ActivityDate.Occurrence, slotSummary.Slot.ActivityDate.Begin, slotSummary.Slot.ActivityDate.End); } if (state.State == SubscriptionState.AfterSubscriptionPhase || state.State == SubscriptionState.DuringOccurrence || state.State == SubscriptionState.AfterOccurrence) { state.HasError = true; state.ErrorMessage = "kein Austragen mehr möglich."; } } return(state); } // hier noch prüfen, ob Eintragung erlaubt // Gäste dürfen nur Sprechstunden // Studierende nur, wenn sie eine Eintragung im aktuellen Seemster haben if (user.MemberState == MemberState.Guest && !(summary.Activity is OfficeHour)) { state.HasError = true; state.ErrorMessage = "Als Gast nur Eintragung in Sprechstunden möglich"; return(state); } if (user.MemberState == MemberState.Student && summary.Activity is Course) { /* OHI 20180528 - Umstellung auf Studiengäge * // Überprüfen, ob zu den Semestern des Kurses auch eine Einschreibung vorliegt * var allSemIds = summary.Activity.SemesterGroups.Select(x => x.Semester.Id).ToList(); * var allSubIds = DB.Subscriptions.OfType<SemesterSubscription>().Where(x => x.UserId.Equals(user.Id)) * .Select(x => x.SemesterGroup.Semester.Id).ToList(); * * var hasSubscription = allSemIds.Any(x => allSubIds.Contains(x)); */ var hasSubscription = DB.Students.Any(x => x.UserId.Equals(user.Id)); if (!hasSubscription) { state.HasError = true; state.ErrorMessage = "Angabe eines Studiengangs erforderlich"; return(state); } } // der State alleine steuert die Anzeige der "Subscribe"-Buttons // dieser wird nur angezeigt, wenn State den Wert "DuringSubscriptionPhase" hat if (summary is ActivitySummary) { // Bei Aktivitäten gibt es Wartelisten, daher keine Beschränkungen mehr auf Zeit und Kapazität hier prüfen state.State = SubscriptionState.DuringSubscriptionPhase; // wenn die Teilnehmerliste gesperrt ist, dann auf "nicht mehr eintragen" setzen if (!occurrence.IsAvailable) { state.State = SubscriptionState.AfterSubscriptionPhase; } } else if (summary is ActivityDateSummary) { var dateSummary = summary as ActivityDateSummary; state.State = GetSubscriptionState(occurrence, dateSummary.Date.Begin, dateSummary.Date.End); // Kapazität prüfen if (occurrence.Capacity >= 0) { if (occurrence.Subscriptions.Count >= occurrence.Capacity) { state.HasError = true; state.ErrorMessage = "belegt"; } } } else if (summary is ActivitySlotSummary) { // wenn es ein Slot ist, dann stecken die Rahmenbedingungen trotzdem im Termin var slotSummary = summary as ActivitySlotSummary; state.State = GetSubscriptionState(slotSummary.Slot.ActivityDate.Occurrence, slotSummary.Slot.ActivityDate.Begin, slotSummary.Slot.ActivityDate.End); // Kapazität prüfen if (occurrence.Capacity >= 0) { if (occurrence.Subscriptions.Count >= occurrence.Capacity) { state.HasError = true; state.ErrorMessage = "belegt"; } } } else // gibt es nicht { state.State = SubscriptionState.AfterOccurrence; } // wenn belegt, dann nicht weiter machen if (state.HasError) { return(state); } // frei? dann Zeitpunkt prüfen switch (state.State) { case SubscriptionState.BeforeSubscriptionPhase: state.HasError = true; state.ErrorMessage = "Noch keine Eintragung möglich"; break; case SubscriptionState.DuringSubscriptionPhase: break; case SubscriptionState.AfterSubscriptionPhase: case SubscriptionState.DuringOccurrence: case SubscriptionState.AfterOccurrence: state.HasError = true; state.ErrorMessage = "Keine Eintragung mehr möglich"; break; } return(state); }