public CarParkingRateDto CalculateHourlyRate(DateTime entryTime, DateTime exitTime) { var hourlyRates = _hourlyRatesRepository.GetHourlyRates(); var dto = new CarParkingRateDto { PackageName = Constants.HourlyRatesName }; var fullDayParkingRate = 0.0; var remainingHoursRate = 0.0; var parkedHours = (exitTime - entryTime).TotalHours; var maxHourlyRate = hourlyRates.OrderByDescending(h => h.MaxAllowedHours).FirstOrDefault(); if (parkedHours > maxHourlyRate.MaxAllowedHours) { fullDayParkingRate = Math.Floor(parkedHours / maxHourlyRate.MaxAllowedHours) * maxHourlyRate.TotalPrice; parkedHours = parkedHours % maxHourlyRate.MaxAllowedHours; } if (parkedHours > 0) { remainingHoursRate = hourlyRates.Where(h => parkedHours <= h.MaxAllowedHours).OrderBy(h => h.MaxAllowedHours).FirstOrDefault().TotalPrice; } dto.TotalPrice = fullDayParkingRate + remainingHoursRate; return(dto); }
public CarParkingRateDto CalculatePackageRate(DateTime entryTime, DateTime exitTime) { var packageRates = _packageRatesRepository.GetPackageRates(); var dto = new CarParkingRateDto(); foreach (var packageRate in packageRates) { var entryDayOfWeek = entryTime.DayOfWeek.ToString(); var exitDayOfWeek = exitTime.DayOfWeek.ToString(); //Check allowed days condition if (packageRate.EntryCondition.ParkingDays.Any(p => p.Equals(entryDayOfWeek, StringComparison.InvariantCultureIgnoreCase)) && packageRate.ExitCondition.ParkingDays.Any(p => p.Equals(exitDayOfWeek, StringComparison.InvariantCultureIgnoreCase))) { //Check entry condition if ((packageRate.EntryCondition.StartTime <= entryTime.TimeOfDay && packageRate.EntryCondition.EndTime >= entryTime.TimeOfDay) || (packageRate.MaxDaysAllowed > 0 && (packageRate.EntryCondition.StartTime <= entryTime.TimeOfDay && entryTime.TimeOfDay <= packageRate.EntryCondition.EndTime.Add(TimeSpan.FromDays(1))) || (packageRate.EntryCondition.StartTime.Subtract(TimeSpan.FromDays(1)) <= entryTime.TimeOfDay && entryTime.TimeOfDay <= packageRate.EntryCondition.EndTime))) { //alculate max exit date and time var maxExitDateTime = entryTime.Date.AddDays(packageRate.MaxDaysAllowed).Add(packageRate.ExitCondition.EndTime); //Check if exit time falls in the range if (exitTime <= maxExitDateTime) { if (dto.TotalPrice == 0 || dto.TotalPrice > packageRate.TotalPrice) { dto.PackageName = packageRate.Name; dto.TotalPrice = packageRate.TotalPrice; } } } } } return(dto); }