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); }
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)); }
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); }
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() }); }
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); }