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