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)); }
public RezervationModel BookRezervation(RezervationCreationParameters parameters) => this.rezervationService.CreateBooking(parameters);
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(); } } }