Example #1
0
        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);
        }
Example #2
0
 public List <Library> GetBooksBasedOnAvailability(AvailabilityItem availability)
 {
     return(dbContext.LibraryItems.Where((L) => L.Availability == availability && L is Books).ToList());
 }
Example #3
0
        /// <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);
        }