public async Task <IActionResult> Return(RegisterReturnVM registerReturn) { if (!ModelState.IsValid) { return(View(registerReturn)); } await service.TryRegisterReturnAsync(registerReturn); return(RedirectToAction(nameof(GetCost), new { id = registerReturn.BookingNumber })); }
public async Task TryRegisterReturnAsync(RegisterReturnVM viewModel) { context.Add(new ReturnOfRentalCar { BookingNumber = viewModel.BookingNumber, TimeOfReturn = viewModel.TimeOfReturn, DistanceCovered = viewModel.DistanceCovered }); await context.SaveChangesAsync(); var booking = GetBookingById(viewModel.BookingNumber); booking.Returned = true; context.Booking.Update(booking); var car = GetCar(booking.CarLicenseNumber); car.CurrentMileage += viewModel.DistanceCovered; car.TimesRented += 1; context.AvailableCars.Update(car); var client = GetClient(booking.ClientSsn); client.DistanceCovered += viewModel.DistanceCovered; context.Clients.Update(client); context.Add(new ClientEvents { ClientId = client.Id, CarId = car.Id, EventDescription = $"{client.FirstName} {client.LastName} returned car {car.CarLicenseNumber}.", TimeOfEvent = DateTime.Now, TypeOfEvent = "Return", }); // Save current mileage on car, times rented, distance covered for client and client event await context.SaveChangesAsync(); //Set client loyalty level var numberOfRentals = context.ClientEvents.Where(c => c.ClientId == client.Id && c.TypeOfEvent == "Return").Count(); switch (numberOfRentals) { case int n when(numberOfRentals >= 3 && numberOfRentals < 5) && client.LoyaltyLevel != "Bronze": client.LoyaltyLevel = "Bronze"; context.Clients.Update(client); SetClientEventLoyalty(client, car); break; case int n when(numberOfRentals >= 5 && client.DistanceCovered < 1000) && client.LoyaltyLevel != "Silver": client.LoyaltyLevel = "Silver"; context.Clients.Update(client); SetClientEventLoyalty(client, car); break; case int n when(numberOfRentals >= 5 && client.DistanceCovered >= 1000) && client.LoyaltyLevel != "Gold": client.LoyaltyLevel = "Gold"; context.Clients.Update(client); SetClientEventLoyalty(client, car); break; default: break; } if (car.CurrentMileage <= 2000) { // Cleaning is required everytime after return car.CleaningRequired = true; context.AvailableCars.Update(car); // Service is required after every third rental if (car.TimesRented % 3 == 0) { car.ServiceRequired = true; context.AvailableCars.Update(car); } } // Save cleaning required, service required and loyalty level await context.SaveChangesAsync(); }