public void UpdateFromActivity(ActivitySlot slot)
    {
        TargetPositiveQuirk = "";
        TargetNegativeQuirk = "";
        TargetDiseaseQuirk  = "";

        HeroRosterId = slot.Hero == null ? -1 : slot.Hero.RosterId;
        Status       = slot.Status == ActivitySlotStatus.Paid && HeroRosterId == -1? ActivitySlotStatus.Available : slot.Status;
    }
Пример #2
0
        /// <summary>
        /// Çağırıldığı action için çağırıldığı tarih-saat'e 1 ekler.
        /// </summary>
        public void Tick(string actionName, int ticks = 1, long msecs = 0, string userId = "")
        {
            var CallCount = calls.GetOrAdd(actionName, a =>
            {
                var slots = new ActivitySlot[24];
                for (var i = 0; i < slots.Length; i++)
                {
                    slots[i] = new ActivitySlot();
                }
                return(slots);
            });

            CallCount[DateTime.Now.Hour].Tick(ticks, msecs);

            if (!string.IsNullOrEmpty(userId))
            {
                users.AddOrUpdate(userId, DateTime.Now, (u, d) => DateTime.Now);
            }
            lock (_lock)
            {
                if (currentDay != DateTime.Today)
                {
                    Save();
                    Clear();

                    currentDay = DateTime.Today;
                }
                else if (currentHour != DateTime.Now.Hour)
                {
                    UsersByHours.Add(currentHour, users.Count);
                    var threshold = DateTime.Now.AddHours(-1);

                    var      expired = users.Where(kv => kv.Value < threshold);
                    DateTime d;
                    foreach (var e in expired)
                    {
                        users.TryRemove(e.Key, out d);
                    }
                    currentHour = DateTime.Now.Hour;
                }
                distinctUsers.Add(userId);
            }
        }
Пример #3
0
        public ActivitySummary Summarize()
        {
            var result = new ActivitySummary();

            result.Actions = calls.Select(c =>
            {
                var slot    = new ActivitySlot();
                slot.Action = c.Key;
                foreach (var s in c.Value)
                {
                    slot.Tick(s.Calls, s.TotalMsecs);
                }
                return(slot);
            }).OrderByDescending(s => s.Calls);

            result.Users = new ReadOnlyDictionary <string, DateTime>(users);

            result.ByFacility = users.GroupBy(u => u.Key.Substring(0, 5))
                                .ToDictionary(g => g.Key, g => g.Count());

            result.UsersByHours      = UsersByHours.ToDictionary(u => u.Key.ToString(), u => u.Value);
            result.DistinctUserCount = distinctUsers.Count;
            return(result);
        }
Пример #4
0
        public OfficeHour CreateOfficeHour(OfficeHourCreateRequest request)
        {
            var db = new TimeTableDbContext();

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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


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

                            occurrence.Slots.Add(slot);
                        }
                    }

                    officeHour.Dates.Add(occurrence);
                }

                db.SaveChanges();
            }

            return(officeHour);
        }
Пример #5
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="htmlHelper"></param>
 /// <param name="date"></param>
 /// <returns></returns>
 public static MvcHtmlString TimeSpanWithDate(this HtmlHelper htmlHelper, ActivitySlot date)
 {
     return(new MvcHtmlString(string.Format("{0:d} {1:t} - {2:t}", date.Begin, date.Begin, @date.End)));
 }
Пример #6
0
 public void Initialize(ActivitySlot slot)
 {
     ActivitySlot = slot;
     UpdateSlot();
 }