public override bool TryPopulate(Envelope envelope, ref AnalyticsItem analyticsItem) { if (!(envelope.EventData is AvailabilityData availabilityData)) { return(false); } AvailabilityItem availabilityItem = new AvailabilityItem(); availabilityItem.Duration = availabilityData.Duration; availabilityItem.Message = availabilityData.Message; availabilityItem.Name = availabilityData.Name; availabilityItem.Success = availabilityData.Success; if (availabilityData.Properties.TryGetValue("AspNetCoreEnvironment", out string environment)) { availabilityItem.Environment = environment; } analyticsItem.AvailabilityItem = availabilityItem; return(true); }
public List <Library> GetBooksBasedOnAvailability(AvailabilityItem availability) { return(dbContext.LibraryItems.Where((L) => L.Availability == availability && L is Books).ToList()); }
/// <summary> /// Maps the internal employee availability model back to Teams availability items. /// </summary> /// <param name="availabilityModel">The model to map.</param> /// <param name="timeZoneInfoId">The time zone id to use to convert utc back to local.</param> /// <returns>The list of Teams availability items.</returns> public IList <AvailabilityItem> MapAvailability(EmployeeAvailabilityModel availabilityModel) { // when writing availability to Teams, we need to use IANA time zones rather than // Windows, so convert if necessary if (!TZConvert.TryWindowsToIana(availabilityModel.TimeZoneInfoId, out string ianaTimeZone)) { ianaTimeZone = availabilityModel.TimeZoneInfoId; } // Some WFM providers allow for availability to be different for different weeks on an // alternating basis, however, Teams only allows a single 'current' availability pattern // to be defined per user this means that we need to identify the item in the rotational // availability that represents the current week. var rotationalWeekNumber = (((int)((_timeService.UtcNow - availabilityModel.CycleBaseDate).TotalDays / 7)) % availabilityModel.NumberOfWeeks) + 1; var groupedByDayItems = availabilityModel.Availability .Where(a => a.WeekNumber == rotationalWeekNumber) .GroupBy(a => a.DayOfWeek.ToString(), a => new TimeSlotItem { StartTime = a.StartTime, EndTime = a.EndTime }, (key, g) => new { Day = key, TimeSlots = g.ToList() }); var availabilityItems = new List <AvailabilityItem>(); foreach (var item in groupedByDayItems) { var availabilityItem = new AvailabilityItem { Recurrence = new RecurrenceItem { Pattern = new PatternItem { DaysOfWeek = new List <string> { item.Day }, Interval = 1, Type = "Weekly" }, Range = new RangeItem { Type = "noEnd" } }, TimeSlots = new List <TimeSlotItem>(), TimeZone = ianaTimeZone }; foreach (var timeSlot in item.TimeSlots) { availabilityItem.TimeSlots.Add(new TimeSlotItem { StartTime = DateTimeHelper.ConvertToLocalTime(timeSlot.StartTime, availabilityModel.TimeZoneInfoId, _timeService), EndTime = DateTimeHelper.ConvertToLocalTime(timeSlot.EndTime, availabilityModel.TimeZoneInfoId, _timeService) }); } availabilityItems.Add(availabilityItem); } if (availabilityItems.Count < 7) { AddUnavailableDays(availabilityItems, ianaTimeZone); } return(availabilityItems); }