private void ValidateBookingParameters(RezervationCreationParameters parameters)
        {
            if (parameters == null)
            {
                throw new InvalidParameterException("Parameters not provided.");
            }

            if (!Enum.IsDefined(typeof(CarTypeEnum), parameters.CarType))
            {
                throw new InvalidParameterException(nameof(parameters.CarType));
            }

            if (string.IsNullOrWhiteSpace(parameters.CarPlateNumber))
            {
                throw new InvalidParameterException(nameof(parameters.CarPlateNumber));
            }

            if (parameters.PickUpDate < DateTime.Now)
            {
                throw new InvalidParameterException($"{nameof(parameters.PickUpDate)} must be set after the current time.");
            }

            if (parameters.ReturnDate < parameters.PickUpDate)
            {
                throw new InvalidParameterException($"{nameof(parameters.ReturnDate)} must be set after {nameof(parameters.PickUpDate)}");
            }

            if (parameters.ClientAccount == null && parameters.ClientId < 1)
            {
                throw new InvalidParameterException("Client account not provided");
            }
        }
        /// <summary>
        /// Creates a booking for the client account.
        /// </summary>
        /// <param name="parameters">Rezervation creation parameters. Hold information on the client account and the rezervation.</param>
        /// <returns></returns>
        public RezervationModel CreateBooking(RezervationCreationParameters parameters)
        {
            this.ValidateBookingParameters(parameters);

            //try to get a client account first
            var clientAccount = this.dbContext.ClientAccounts.SingleOrDefault(x => x.ClientId == parameters.ClientId)?.ToModel();

            if (clientAccount == null && parameters.ClientAccount != null)
            {
                clientAccount = this.clientAccountService.Add(parameters.ClientAccount);
            }
            else if (parameters.ClientAccount == null && clientAccount == null)
            {
                throw new NotFoundException("Client account not found.");
            }

            var dbRezervation = new Rezervation()
            {
                ClientId       = clientAccount.ClientId,
                CarPlateNumber = parameters.CarPlateNumber,
                PickUpDate     = parameters.PickUpDate,
                ReturnDate     = parameters.ReturnDate,
            };

            //get the car type
            var carType = CarTypes.GetCarType(parameters.CarType);

            dbRezervation.CarType    = (int)carType.Type;
            dbRezervation.RentaltFee = carType.GetRentalFee(parameters.PickUpDate, parameters.ReturnDate);
            dbRezervation.DepositFee = carType.GetDepositFee(dbRezervation.RentaltFee);

            this.dbContext.Rezervations.Add(dbRezervation);
            this.dbContext.SaveChanges();

            return(dbRezervation.ToModel(clientAccount));
        }
示例#3
0
 public RezervationModel BookRezervation(RezervationCreationParameters parameters) => this.rezervationService.CreateBooking(parameters);
示例#4
0
        public void CreateRezervationTest()
        {
            var createRezervationParameters = new RezervationCreationParameters
            {
                PickUpDate     = DateTime.Today.AddDays(1),             // set to Today for simplicity.
                ReturnDate     = DateTime.Today.AddDays(5),
                CarPlateNumber = "CA1234AC",
                CarType        = CarTypeEnum.Family,
                ClientAccount  = new ClientAccountCreationParams
                {
                    Email    = "*****@*****.**",
                    FullName = "Client_Rez_1",
                    Phone    = "+12345",
                },
            };

            using (var context = new CarRentalDbContext(this.dbContextOptions))
            {
                var clientAccountService = new ClientAccountService(context);
                var rezervationService   = new RezervationService(context, clientAccountService);

                var rezervationModel = rezervationService.CreateBooking(createRezervationParameters);

                // Sanity check
                Assert.IsTrue(rezervationModel.RezervationId > 0);
                Assert.AreEqual(rezervationModel.PickUpDate, createRezervationParameters.PickUpDate);
                Assert.AreEqual(rezervationModel.ReturnDate, createRezervationParameters.ReturnDate);
                Assert.AreEqual(rezervationModel.CarPlateNumber, createRezervationParameters.CarPlateNumber);
                Assert.AreEqual(rezervationModel.CarType, createRezervationParameters.CarType);
                Assert.AreEqual(rezervationModel.IsCancelled, false);
                Assert.AreEqual(rezervationModel.IsPickedUp, false);
                Assert.AreEqual(rezervationModel.IsReturned, false);

                // Fee calculation.
                var carType = CarTypes.GetCarType(createRezervationParameters.CarType);

                // Test the actual calculations in the car type class.
                var rentalFee  = carType.RentalRateFee * (decimal)(createRezervationParameters.ReturnDate - createRezervationParameters.PickUpDate).TotalHours;
                var depositFee = rentalFee * (carType.DepositFeePercentage / 100);

                Assert.AreEqual(rezervationModel.RentaltFee, rentalFee);
                Assert.AreEqual(rezervationModel.DepositFee, depositFee);
                Assert.IsNull(rezervationModel.CancelationFeeRate);

                var createRezervationParametersExistingClient = new RezervationCreationParameters
                {
                    PickUpDate     = DateTime.Today.AddDays(1),                 // set to Today for simplicity.
                    ReturnDate     = DateTime.Today.AddDays(5),
                    CarPlateNumber = "CA1234AC",
                    CarType        = CarTypeEnum.Family,
                    ClientId       = context.ClientAccounts.First().ClientId,
                };
                rezervationModel = rezervationService.CreateBooking(createRezervationParametersExistingClient);
                Assert.IsTrue(rezervationModel.RezervationId > 0);

                try
                {
                    var createRezervationParametersNoClient = new RezervationCreationParameters
                    {
                        PickUpDate     = DateTime.Today.AddDays(1),                     // set to Today for simplicity.
                        ReturnDate     = DateTime.Today.AddDays(5),
                        CarPlateNumber = "CA1234AC",
                        CarType        = CarTypeEnum.Family,
                    };
                    rezervationModel = rezervationService.CreateBooking(createRezervationParametersNoClient);
                    Assert.Fail();
                }
                catch (InvalidParameterException)
                {
                }
                catch
                {
                    Assert.Fail();
                }
            }
        }