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; }
/// <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); } }
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); }
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); }
/// <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))); }
public void Initialize(ActivitySlot slot) { ActivitySlot = slot; UpdateSlot(); }