private static RateForTimePeriod GetNormalizedRateForTimePeriod(RateForTimePeriod rate, DateTime startTime, DateTime endTime) { var newStartTime = startTime.GetDateTimeNextWeekday(rate.StartTime.DayOfWeek); var newEndTime = endTime.GetDateTimeNextWeekday(rate.EndTime.DayOfWeek); // normalize the rate to the Day of the starttime, and the time of the original rate return(new RateForTimePeriod { Price = rate.Price, StartTime = new DateTime(newStartTime.Year, newStartTime.Month, newStartTime.Day, rate.StartTime.Hour, rate.StartTime.Minute, rate.StartTime.Second), EndTime = new DateTime(newEndTime.Year, newEndTime.Month, newEndTime.Day, rate.EndTime.Hour, rate.EndTime.Minute, rate.EndTime.Second) }); }
// This method is not being used because overlapping rates are not allowed by the API private static RateForTimePeriod HandleOverlappingRate(DateTime startTime, DateTime endTime, IOrderedEnumerable <RateForTimePeriod> availableRates, RateForTimePeriod activeRate) { if (activeRate == null) { // no perfect match var overlappingRates = availableRates.Where(r => r.StartTime < endTime) .Intersect(availableRates.Where(r => startTime <= r.EndTime)); if (!overlappingRates.Any()) { return(null); // out of bounds } var areContiguous = true; var seedTime = overlappingRates.FirstOrDefault().StartTime; foreach (var rate in overlappingRates) { areContiguous &= rate.StartTime == seedTime; if (!areContiguous) { return(null); // garage is closed for some time } seedTime = rate.EndTime; } if (areContiguous) { return(overlappingRates.OrderByDescending(r => r.Price).FirstOrDefault()); } } return(null); }