Beispiel #1
0
        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 }));
        }
Beispiel #2
0
        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();
        }