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