コード例 #1
0
        public OfficeHoursSlot GetSlotForDate(DateTime start, int ohId)
        {
            OfficeHoursTeacherAvailability availability = null;
            OfficeHoursSlot x            = null;
            OfficeHours     oh           = null;
            LmsUser         u            = null;
            var             defaultQuery = new DefaultQueryOver <OfficeHoursSlot, int>()
                                           .GetQueryOver(() => x)
                                           .JoinAlias(() => x.User, () => u, JoinType.InnerJoin)
                                           .JoinAlias(() => x.Availability, () => availability, JoinType.InnerJoin)
                                           .JoinAlias(() => availability.Meeting, () => oh, JoinType.InnerJoin)
                                           .Where(() => x.Start == start && oh.Id == ohId);

            return(Repository.FindOne(defaultQuery).Value);
        }
コード例 #2
0
        public IEnumerable <OfficeHoursSlot> GetSlotsForDate(DateTime start, DateTime end, int ohId)
        {
            OfficeHoursTeacherAvailability availability = null;
            OfficeHoursSlot x            = null;
            OfficeHours     oh           = null;
            LmsUser         u            = null;
            var             defaultQuery = new DefaultQueryOver <OfficeHoursSlot, int>()
                                           .GetQueryOver(() => x)
                                           .JoinAlias(() => x.User, () => u, JoinType.InnerJoin)
                                           .JoinAlias(() => x.Availability, () => availability, JoinType.InnerJoin)
                                           .JoinAlias(() => availability.Meeting, () => oh, JoinType.InnerJoin)
                                           .Where(() => x.Start >= start && x.Start < end && oh.Id == ohId);

            return(Repository.FindAll(defaultQuery));
        }
コード例 #3
0
        private static OfficeHoursTeacherAvailability ConvertFromDto(OfficeHours oh, LmsUser lmsUser, OfficeHoursTeacherAvailabilityDto availabilityDto)
        {
            var entity = new OfficeHoursTeacherAvailability
            {
                User        = lmsUser,
                Duration    = availabilityDto.Duration,
                Intervals   = string.Join(",", availabilityDto.Intervals.Select(x => $"{x.Start}-{x.End}")),
                DaysOfWeek  = string.Join(",", availabilityDto.DaysOfWeek),
                PeriodStart = availabilityDto.PeriodStart,
                PeriodEnd   = availabilityDto.PeriodEnd,
                Meeting     = oh
            };

            return(entity);
        }
コード例 #4
0
 private static OfficeHoursTeacherAvailabilityDto ConvertToDto(OfficeHoursTeacherAvailability availability)
 {
     return(new OfficeHoursTeacherAvailabilityDto
     {
         Duration = availability.Duration,
         PeriodStart = availability.PeriodStart,
         PeriodEnd = availability.PeriodEnd,
         DaysOfWeek = availability.DaysOfWeek.Split(',').Select(x => Int32.Parse(x)).ToArray(),
         Intervals = availability.Intervals.Split(',').Select(x =>
         {
             var intervals = x.Split('-');
             return new AvailabilityInterval {
                 Start = int.Parse(intervals[0]), End = int.Parse(intervals[1])
             };
         }).ToList()
     });
 }
コード例 #5
0
        private IEnumerable <SlotDto> GetSlotsForAvailability(OfficeHoursTeacherAvailabilityDto availabilityDto,
                                                              DateTime dateStart, DateTime dateEnd, int lmsUserId, OfficeHoursTeacherAvailability availability)
        {
            var slots             = new List <SlotDto>();
            var availabilityStart = availabilityDto.PeriodStart;
            var checkStart        = availabilityStart > dateStart ? availabilityStart : dateStart;
            var periodEnd         = availabilityDto.PeriodEnd.Date.AddDays(1);
            var checkEnd          = periodEnd < dateEnd ? periodEnd : dateEnd;

            var dayCheckStart = checkStart.Date;
            var dayCheckEnd   = checkEnd.Date.AddDays(1);
            var dbSlots       = availability?.Slots;

            while (dayCheckStart < dayCheckEnd)
            {
                if (availabilityDto.DaysOfWeek.Contains((int)dayCheckStart.DayOfWeek))
                {
                    //dayly cycles for intervals
                    foreach (var interval in availabilityDto.Intervals)
                    {
                        var intervalCheckStart = dayCheckStart.AddMinutes(interval.Start) > checkStart
                            ? dayCheckStart.AddMinutes(interval.Start)
                            : new DateTime(checkStart.Year, checkStart.Month, checkStart.Day, checkStart.Hour, 0, 0, DateTimeKind.Utc)
                                                 .AddMinutes((checkStart.Minute / availabilityDto.Duration + (checkStart.Minute % availabilityDto.Duration == 0 ? 0 : 1)) * availabilityDto.Duration);

                        if (intervalCheckStart < checkStart || intervalCheckStart >= checkEnd || intervalCheckStart >= availabilityDto.PeriodEnd) //check if interval start is inside of period that we need to check
                        {
                            continue;
                        }

                        var intervalCheckEnd = interval.End > interval.Start
                            ? dayCheckStart.AddMinutes(interval.End)
                            : dayCheckStart.AddDays(1).AddMinutes(interval.End);
                        while (intervalCheckStart < intervalCheckEnd)
                        {
                            var dbSlot =
                                dbSlots?.FirstOrDefault(x => x.Start == intervalCheckStart); // && end
                            slots.Add(dbSlot == null
                                ? new SlotDto
                            {
                                Start = intervalCheckStart,
                                End   = intervalCheckStart.AddMinutes(availabilityDto.Duration)
                            }
                                : ConvertToDto(dbSlot, lmsUserId));

                            intervalCheckStart = intervalCheckStart.AddMinutes(availabilityDto.Duration);
                        }
                    }
                }

                dayCheckStart = dayCheckStart.AddDays(1);
            }

            return(slots);
        }