// Calculates the rental price for a reservation when car has been returned /// <summary> /// The formula for calculating the rental cost is: /// baseDayRentalPrice * numberOfDays * baseDayRentalModifier + kmPrice * numberOfKm * kmPriceModifier /// Preconditions: The given ActivatedReservation must be deactivated before calling this method. /// Calculates the rental price for a reservation. /// </summary> /// <param name="activatedReservationId"></param> /// <returns>The total cost of the rental</returns> public async Task <double> calculateCost(int activatedReservationId) { await checkRentalRates(); service = new DatabaseAccessService(context); var activatedReservation = await service.getActivatedReservation(activatedReservationId); if (activatedReservation == null) { throw new ArgumentException("No ActivatedReservation with given id exists"); } var rentedCar = await service.getRentalCar(activatedReservation.rentedCar.carNumber); var carType = rentedCar.rentalCarType; var dayDiff = (activatedReservation.reservation.expectedReturnDate - activatedReservation.reservation.rentalDate).Days; var mileage = activatedReservation.endMileage - activatedReservation.startMileage; double price = baseDayRental * dayDiff * carType.basePriceModifier + kmPrice * mileage * carType.kmPriceModifier; return(price); }
/// <summary> /// Precondition: The given ActivatedReservation must be currently active. /// Deactivates the given ActivatedReservation. This means the rented car has been /// returned. /// </summary> /// <param name="activatedReservationId"></param> /// <returns>Returns the deactivated ActivatedReservation.</returns> public async Task <ActivatedReservation> deactivateActivatedReservation(int activatedReservationId) { var activatedReservation = await db.getActivatedReservation(activatedReservationId); if (!activatedReservation.isCurrentlyActive) { throw new InvalidOperationException("Cannot deactivate an already deactivated ActivatedReservation"); } activatedReservation.endMileage = activatedReservation.rentedCar.currentMileage; activatedReservation.isCurrentlyActive = false; activatedReservation.actualReturnDate = DateTime.Now; await context.SaveChangesAsync(); return(activatedReservation); }