예제 #1
0
        public List <FreeTermDto> GetFreeTerms(HairSalon hairSalon)
        {
            var workingHours = hairSalon.WorkingHours.ToList();

            if (!workingHours.Any())
            {
                throw new Exception("Sport object doesn't have working hours");
            }

            var futureDays   = 7;
            var reservations = hairSalon.Reservations
                               .Where(r => r.Date >= DateTime.Today && r.Date <= DateTime.Today.AddDays(futureDays))
                               .ToList();

            var freeTerms = new List <FreeTermDto>();

            for (int i = 0; i <= futureDays; i++)
            {
                var date           = DateTime.Today.AddDays(i);
                var day            = (int)date.DayOfWeek == 0 ? 7 : (int)date.DayOfWeek;
                var wh             = workingHours.Find(w => w.Day == day);
                var openTimeHours  = wh.OpenTime.Hours;
                var closeTimeHours = wh.CloseTime.Hours;

                if (closeTimeHours == 0)
                {
                    closeTimeHours = 24;
                }

                for (int j = openTimeHours; j < closeTimeHours; j++)
                {
                    var startTime = new TimeSpan(j, 0, 0);
                    var endTime   = startTime.Add(TimeSpan.FromHours(1));

                    if (startTime.Hours == 23)
                    {
                        endTime = new TimeSpan(0, 0, 0);
                    }

                    var freeTerm1 = new FreeTermDto
                    {
                        Date      = date,
                        StartTime = startTime,
                    };

                    var freeTerm2 = new FreeTermDto
                    {
                        Date      = date,
                        StartTime = new TimeSpan(j, 30, 0),
                    };

                    freeTerms.Add(freeTerm1);
                    freeTerms.Add(freeTerm2);
                }
            }

            List <FreeTermDto> output = new List <FreeTermDto>();

            foreach (var ft in freeTerms)
            {
                output.Add(ft);

                foreach (var res in reservations)
                {
                    if (ft.Date == res.Date && ft.StartTime == res.StartTime)
                    {
                        output.Remove(ft);
                    }
                }
            }

            return(output);
        }
        public List <FreeTermDto> GetFreeTerms(SportObject sportObject)
        {
            var workingHours = sportObject.WorkingHours.ToList();

            if (!workingHours.Any())
            {
                throw new Exception("Sport object doesn't have working hours");
            }

            var maxTimeWorkingHour = sportObject.WorkingHours.Min(wh => wh.CloseTime);

            if (maxTimeWorkingHour.Hours != 0)
            {
                maxTimeWorkingHour = sportObject.WorkingHours.Max(wh => wh.CloseTime);
            }

            var prices = sportObject.Prices.ToList();

            if (!prices.Any())
            {
                throw new Exception("Sport object doesn't have prices");
            }

            var futureDays   = 7;
            var reservations = sportObject.Reservations
                               .Where(r => r.Date >= DateTime.Today && r.Date <= DateTime.Today.AddDays(futureDays))
                               .ToList();

            var freeTerms = new List <FreeTermDto>();

            for (int i = 0; i <= futureDays; i++)
            {
                var date           = DateTime.Today.AddDays(i);
                var day            = (int)date.DayOfWeek == 0 ? 7 : (int)date.DayOfWeek;
                var wh             = workingHours.Find(w => w.Day == day);
                var openTimeHours  = wh.OpenTime.Hours;
                var closeTimeHours = wh.CloseTime.Hours;

                if (closeTimeHours == 0)
                {
                    closeTimeHours = 24;
                }

                for (int j = openTimeHours; j < closeTimeHours; j++)
                {
                    var startTime = new TimeSpan(j, 0, 0);
                    var endTime   = startTime.Add(TimeSpan.FromHours(1));

                    if (startTime.Hours == 23)
                    {
                        endTime = new TimeSpan(0, 0, 0);
                    }

                    var price = sportObject.Prices.SingleOrDefault(p => startTime >= p.TimeFrom && startTime < p.TimeTo && p.TimeTo != maxTimeWorkingHour);

                    if (price == null)
                    {
                        price = sportObject.Prices.SingleOrDefault(p => p.TimeTo == maxTimeWorkingHour);
                    }

                    var freeTerm = new FreeTermDto
                    {
                        Date      = date,
                        StartTime = startTime,
                        Price     = price.PricePerHour
                    };

                    freeTerms.Add(freeTerm);
                }
            }

            List <FreeTermDto> output = new List <FreeTermDto>();

            foreach (var ft in freeTerms)
            {
                output.Add(ft);

                foreach (var res in reservations)
                {
                    if (ft.Date == res.Date && ft.StartTime == res.StartTime)
                    {
                        output.Remove(ft);
                    }
                }
            }

            return(output);
        }