Example #1
0
        public async Task <IActionResult> Park(ParkParkedVehicleViewModel viewModel)
        {
            var parkSpots = ParkingSpotContainer.GetParkSpots(_configuration);

            if (ModelState.IsValid)
            {
                var vehicle = new ParkedVehicle();
                vehicle.VehicleTypeId = int.Parse(Request.Form["Type"].ToString());
                if (vehicle.VehicleTypeId == 0)
                {
                    throw new ArgumentException("The value of the SelectItem selected was zero.");
                }

                var member = TempDataExtensions.Get <Member>(TempData, "member");
                vehicle.MemberId = member.MemberId;
                PopulateVehicleFromViewModel(viewModel, vehicle);
                await ParkVehicleInBackend(parkSpots, vehicle);

                vehicle.IsParked = true;
                _context.Add(vehicle);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }

            return(View());
        }
Example #2
0
        public async Task <IActionResult> UnParkConfirmed(string RegNum)
        {
            var vehicle = await _context.ParkedVehicles.FindAsync(RegNum);

            var vehicleType = await _context.VehicleTypes.FirstOrDefaultAsync(t => t.Id == vehicle.VehicleTypeId);

            var spotsRequired = GetRequiredNumberOfSpots(vehicleType);

            if (vehicle != null)
            {
                vehicle.IsParked = false;
                _context.Update(vehicle);
                await _context.SaveChangesAsync();
            }
            else
            {
                throw new ArgumentNullException(nameof(vehicle), "The vehicle could not be found in the database.");
            }

            ParkSpot spot;

            // TODO: More elegant solution without extra calls to FindSpotByVehicle
            for (var i = 0; i < spotsRequired; i++)
            {
                spot = ParkingSpotContainer.FindSpotByVehicle(vehicle);
                spot.Unpark(vehicle);
            }

            TempDataExtensions.Set(TempData, "vehicle", vehicle);
            TempData.Keep();
            return(RedirectToAction(nameof(ParkingReceipt)));
        }
        private void InitializeParkSpots()
        {
            var vehicles = _context.ParkedVehicles.ToList();

            for (var i = 0; i < vehicles.Count(); i++)
            {
                if (vehicles[i].VehicleTypeId == _context.VehicleTypes.FirstOrDefault(v => v.Name == "Truck").Id)
                {
                    ParkOnMultipleSpots(vehicles[i], 3);
                }
                else
                {
                    if (vehicles[i].VehicleTypeId == _context.VehicleTypes.FirstOrDefault(v => v.Name == "Bus").Id)
                    {
                        ParkOnMultipleSpots(vehicles[i], 2);
                    }
                    else
                    {
                        var vehicleIsMotorcycle = vehicles[i].VehicleTypeId == _context.VehicleTypes.FirstOrDefault(v => v.Name == "Motorcycle").Id;
                        var spot = ParkingSpotContainer.GetAvailableSpot(parkSpots, vehicleIsMotorcycle);

                        spot.Park(vehicles[i]);
                        spot.VehicleCount  += 1;
                        spot.HasMotorcycles = vehicleIsMotorcycle;
                        parkSpots[spot.Id]  = spot;
                    }
                }
            }
            ParkingSpotContainer.IsInitialized = true;
        }
        private void ParkOnMultipleSpots(ParkedVehicle vehicle, int spotsRequired)
        {
            int startOfSpotSequence;

            if (ParkingSpotContainer.FindConsecutiveSpots(spotsRequired, out startOfSpotSequence))
            {
                var spots = ParkingSpotContainer.ParkOnMultipleSpots(startOfSpotSequence, spotsRequired, vehicle);
                var n     = 0;
                for (var i = startOfSpotSequence; i < startOfSpotSequence + spotsRequired; i++)
                {
                    parkSpots[i] = spots[n];
                    n++;
                }
            }
        }
Example #5
0
        public async Task <IActionResult> RePark(string registrationNumber)
        {
            var vehicle = await _context.ParkedVehicles.FirstOrDefaultAsync(v => v.RegistrationNumber.Equals(registrationNumber));

            if (vehicle == null)
            {
                TempData.Keep();
                return(RedirectToAction(nameof(Park)));
            }
            vehicle.ParkingDate = DateTime.Now;
            vehicle.IsParked    = true;
            var parkSpots = ParkingSpotContainer.GetParkSpots(_configuration);

            await ParkVehicleInBackend(parkSpots, vehicle);

            try
            {
                _context.Update(vehicle);
                await _context.SaveChangesAsync();

                return(RedirectToAction(actionName: "Index", controllerName: "Vehicles"));
            }
            catch (DbUpdateConcurrencyException)
            {
                if (await _context.ParkedVehicles.FirstOrDefaultAsync(v => v.RegistrationNumber == registrationNumber) == null)
                {
                    TempData.Keep();
                    return(RedirectToAction(nameof(Park)));
                }
                else
                {
                    throw;
                }
            }
            return(View());
        }
Example #6
0
        private async Task ParkVehicleInBackend(ParkSpot[] parkSpots, ParkedVehicle vehicle)
        {
            var vehicleType = await _context.VehicleTypes.Where(v => v.Id == vehicle.VehicleTypeId).FirstOrDefaultAsync();

            int numberRequired = GetRequiredNumberOfSpots(vehicleType);
            int startOfSpotSequence;

            if (vehicleType.Name == "Motorcycle")
            {
                {
                    var spot = ParkingSpotContainer.GetAvailableSpot(parkSpots, true);
                    if (spot != null)
                    {
                        spot.Park(vehicle);
                        spot.VehicleCount++;
                        spot.HasMotorcycles = true;
                    }
                }
            }
            else if (vehicleType.Name != "Motorcycle" && ParkingSpotContainer.FindConsecutiveSpots(numberRequired, out startOfSpotSequence))
            {
                ParkingSpotContainer.ParkOnMultipleSpots(startOfSpotSequence, numberRequired, vehicle);
            }
        }
 public SpotStatusViewComponent(GarageContext context, IConfiguration configuration)
 {
     _context       = context;
     _configuration = configuration;
     parkSpots      = ParkingSpotContainer.GetParkSpots(configuration);
 }