Example #1
0
        public Dictionary <DateTimeOffset, Scheduler> GetSchedulers(string barberId, List <DateTimeOffset> dates)
        {
            Dictionary <DateTimeOffset, Scheduler> result = new Dictionary <DateTimeOffset, Scheduler>();

            //Fetch Bookings
            List <Bookings> bookings = _bookingRepository
                                       .GetBookingsByDates(barberId, dates, false,
                                                           b => b.State == BookingConstants.Booked || b.State == BookingConstants.CheckedIn);
            Dictionary <DateTimeOffset, List <Bookings> > bookingDictionary =
                bookings.ClassifyToDictionary(booking => booking.BookedTime.GetDate());

            //Fetch BarberSchedules
            Dictionary <DateTimeOffset, List <BarberSchedules> > barberScheduleDictionary =
                _scheduleRepository.GetSchedulesOfBarber(barberId, dates);

            dates.ForEach(date =>
            {
                //Convert Bookings into Slot
                List <Slot> bookedSlots = bookingDictionary
                                          .GetValueOrDefault(date)
                                          ?.Select(booking => booking.ToSlot())
                                          .ToList();

                //Convert BarberSchedules into FreeTime
                List <FreeTime> freeTimes = barberScheduleDictionary
                                            .GetValueOrDefault(date)
                                            ?.Select(schedule => schedule.ToFreeTime(date))
                                            .Where(freeTime => freeTime.YetToCome() || freeTime.OccursNow())
                                            .ToList();

                if (freeTimes == null)
                {
                    return;
                }

                //Limit start time for current freetime
                var occursNow = freeTimes.Find(freeTime => freeTime.OccursNow());
                if (occursNow != null)
                {
                    var now = DateTimeUtil.GetTimeNow();
                    now     = now.SetTime(now.Hour, now.Minute, 0); //Set second tick to 0

                    occursNow.Start = now.ToTimePoint();
                }

                Scheduler scheduler = new Scheduler(freeTimes);
                scheduler.AddBookedSlots(bookedSlots);

                result.Add(date, scheduler);
            });

            return(result);
        }