// 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);
        }
Example #2
0
        /// <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);
        }