/// <summary>
        ///
        /// </summary>
        /// <param name="search"></param>
        /// <returns></returns>
        public async Task <ListInfo <CarModel> > Search(CarSearch search)
        {
            ListInfo <CarModel> result = null;

            try
            {
                var query = from car in CarModelQuery(Context)
                            where (
                    !search.ModelIds.Any() ||
                    search.ModelIds.Any(x => x == car.ModelId)
                    ) && (
                    !search.Years.Any() ||
                    search.Years.Any(x => x == car.Year)
                    ) && (
                    string.IsNullOrEmpty(search.Search) ||
                    car.ModelName.Contains(search.Search) ||
                    car.BrandName.Contains(search.Search) ||
                    car.License.Contains(search.Search)
                    )
                            select car;

                result = new ListInfo <CarModel>
                {
                    Count = await query.CountAsync(),
                    Data  = await query.Paginate(search).ToListAsync()
                };
            }
            catch (Exception ex)
            {
                throw;
            }
            return(result);
        }
Beispiel #2
0
        public IHttpActionResult PutCarSearch(int id, CarSearch carSearch)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (id != carSearch.id)
            {
                return(BadRequest());
            }

            db.Entry(carSearch).State = EntityState.Modified;

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!CarSearchExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(StatusCode(HttpStatusCode.NoContent));
        }
Beispiel #3
0
        public async Task <IActionResult> SearchCars([FromQuery] CarSearch model)
        {
            if (ModelState.IsValid)
            {
                var vehicles = await VehicleService.GetVehiclesBySearch(model);

                List <VehicleDTO> vehicleDTOs = new List <VehicleDTO>();
                foreach (Vehicle v in vehicles)
                {
                    vehicleDTOs.Add(new VehicleDTO()
                    {
                        VehicleId    = v.VehicleId,
                        Additional   = v.Additional,
                        Baggage      = v.Baggage,
                        CarType      = v.CarType,
                        CostPerDay   = v.CostPerDay,
                        Doors        = v.Doors,
                        Fuel         = v.Fuel,
                        Name         = v.Name,
                        Passangers   = v.Passangers,
                        Transmission = v.Transmission,
                        Rating       = await VehicleService.GetVehicleRatingAsInteger(v.VehicleId)
                    });
                }

                return(Ok(vehicleDTOs));
            }

            ModelState.AddModelError("", "Cannot retrieve user data.");
            return(BadRequest(ModelState));
        }
Beispiel #4
0
        public ViewResult BusList(CarSearch searchModel, int page = 1)
        {
            var car  = repository.Cars;
            var cars = new List <Car>();

            foreach (var c in car)
            {
                if (c.Category.Equals("C"))
                {
                    cars.Add(c);
                }
            }

            var model = new CarsListViewModel
            {
                Cars       = cars,
                PagingInfo = new PagingInfo
                {
                    CurrentPage = page,
                    CarsPerPage = PageSize,
                    TotalCars   = repository.Cars.Count()
                }
            };

            return(View(model));
        }
Beispiel #5
0
        /// <summary>
        /// Starts search and stores results using unique key for future retrieval
        /// </summary>
        /// <param name="uniqueKey"></param>
        /// <param name="carSearch"></param>
        public ScrapeResult StartCarSearch(Guid uniqueKey, CarSearch carSearch)
        {
            var start = DateTime.Now;

            try
            {
                var prefs              = new List <ProcessingPreferences>();
                var prefsDealerCom     = new ProcessingPreferences(new DealerComSelector(carSearch.Make, carSearch.Model, carSearch.IsLoaner ? InventoryType.Loaner : InventoryType.New));
                var prefsDealerOn      = new ProcessingPreferences(new DealerOnSelector(carSearch.Make, carSearch.Model, carSearch.IsLoaner ? InventoryType.Loaner : InventoryType.New));
                var prefsDealerInspire = new ProcessingPreferences(new DealerInspireSelector(carSearch.Make, carSearch.Model, carSearch.IsLoaner ? InventoryType.Loaner : InventoryType.New));

                switch (carSearch.DealerType)
                {
                case DealerType.DealerCom:
                    prefs.Add(prefsDealerCom);
                    break;

                case DealerType.DealerOn:
                    prefs.Add(prefsDealerOn);
                    break;

                case DealerType.DealerInspire:
                    prefs.Add(prefsDealerInspire);
                    break;

                default:
                    prefs.AddRange(new[]
                    {
                        prefsDealerCom,
                        prefsDealerInspire,
                        prefsDealerOn
                    });
                    break;
                }

                var processor     = new Processor(prefs.ToArray());
                var scrapeResults = processor.Scrap();

                return(new ScrapeResult
                {
                    ScrapeResults = scrapeResults,
                    RuntimeException = null,
                    DurationInSeconds = (decimal)(DateTime.Now - start).TotalSeconds
                });
            }
            catch (Exception e)
            {
                return(new ScrapeResult
                {
                    ScrapeResults = new List <CarInfo> {
                        new CarInfo {
                            Make = "Search Error"
                        }
                    },
                    RuntimeException = e,
                    DurationInSeconds = (decimal)(DateTime.Now - start).TotalSeconds
                });
            }
        }
Beispiel #6
0
 public async Task <List <CarDto> > Search(CarSearch search)
 {
     if (string.IsNullOrWhiteSpace(search.CarNumber) && !search.CarModelid.HasValue)
     {
         return(_mapper.Map <List <Car>, List <CarDto> >(await _repository.GetAllAsync()));
     }
     return(_mapper.Map <List <Car>, List <CarDto> >(await _repository.Search(search)));
 }
Beispiel #7
0
        public List <Car> FindCars(CarSearchModel searchModel)
        {//takes search model, makes instance of another class CarSearch,
         //and uses a method in the class to return a list of cars that
         //fit the search criteria
            var search = new CarSearch();
            var list   = search.SearchCars(searchModel).ToList();

            return(list);
        }
Beispiel #8
0
        public IHttpActionResult PostCarSearch(CarSearch carSearch)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            db.CarSearches.Add(carSearch);
            db.SaveChanges();

            return(CreatedAtRoute("DefaultApi", new { id = carSearch.id }, carSearch));
        }
Beispiel #9
0
 public ActionResult <PagedResponse <CarShowDto> > Get([FromQuery] CarSearch query)
 {
     try
     {
         return(Ok(_getCars.Execute(query)));
     }
     catch (Exception e)
     {
         Console.WriteLine(e.Message);
         return(StatusCode(500));
     }
 }
        //[ResponseType(typeof(List<CarItem>))]
        public List <CarItem> GetAllCarsByDistance([FromUri] CarSearch carSearch)
        {
            var             userIdentity = System.Web.HttpContext.Current.User.Identity;
            string          loggedInUser = userIdentity.GetUserId().ToString();
            ApplicationUser user         = db.Users.Find(loggedInUser);

            carSearch.lat   = user.Lat;
            carSearch.aLong = user.Long;

            List <CarItem> carList = HelperClass.GetCarsByDistance(db, carSearch);

            return(carList);
        }
Beispiel #11
0
        public IHttpActionResult DeleteCarSearch(int id)
        {
            CarSearch carSearch = db.CarSearches.Find(id);

            if (carSearch == null)
            {
                return(NotFound());
            }

            db.CarSearches.Remove(carSearch);
            db.SaveChanges();

            return(Ok(carSearch));
        }
Beispiel #12
0
        public async Task <List <Car> > Search(CarSearch search)
        {
            var query = _dbContext.Cars.AsNoTracking().AsQueryable();

            if (!string.IsNullOrWhiteSpace(search.CarNumber))
            {
                query = query.Where(c => c.CarNumber.Contains(search.CarNumber, StringComparison.InvariantCultureIgnoreCase));
            }
            if (search.CarModelid.HasValue)
            {
                query = query.Where(c => c.CarModelid == search.CarModelid.Value);
            }
            return(await query.OrderBy(c => c.CarNumber).ToListAsync());
        }
Beispiel #13
0
        public void Can_Search_Numeric()
        {
            //przygotowanie
            Mock <ICarRepository> mock = new Mock <ICarRepository>();

            mock.Setup(m => m.Cars).Returns(new Car[]
            {
                new Car {
                    CarID = 1, Model = "P1", Brand = "B1", Category = "", PricePerDay = 100, Year = 2001, Capacity = 2
                },
                new Car {
                    CarID = 2, Model = "P2", Brand = "B2", Category = "", PricePerDay = 200, Year = 2002, Capacity = 2
                },
                new Car {
                    CarID = 3, Model = "P3", Brand = "B3", Category = "", PricePerDay = 300, Year = 2003, Capacity = 2
                },
                new Car {
                    CarID = 4, Model = "P4", Brand = "B4", Category = "", PricePerDay = 400, Year = 1990, Capacity = 1
                },
                new Car {
                    CarID = 5, Model = "P5", Brand = "B5", Category = "", PricePerDay = 500, Year = 1991, Capacity = 1
                },
                new Car {
                    CarID = 6, Model = "P6", Brand = "B6", Category = "", PricePerDay = 600, Year = 1993, Capacity = 2
                },
                new Car {
                    CarID = 7, Model = "P7", Brand = "B7", Category = "", PricePerDay = 700, Year = 1999, Capacity = 2
                },
                new Car {
                    CarID = 8, Model = "P8", Brand = "B8", Category = "", PricePerDay = 800, Year = 2001, Capacity = 2
                },
            });
            CarController controller = new CarController(mock.Object);

            CarSearch carSearch = new CarSearch {
                MinPrice = 200, MaxPrice = 600, MinYear = 1990, MaxYear = 2000, MinCapacity = 1, MaxCapacity = (decimal)1.6
            };

            //działanie
            CarsListMainModel result = (CarsListMainModel)controller.List(carSearch, 1).Model;

            Car[] carArray = result.CarListViewModel.Cars.ToArray();

            //asercje
            Assert.IsTrue(carArray.Length == 2);
            Assert.AreEqual(carArray[0].CarID, 4);
            Assert.AreEqual(carArray[1].CarID, 5);
        }
Beispiel #14
0
        public void Can_Sort_Numeric()
        {
            //przygotowanie
            Mock <ICarRepository> mock = new Mock <ICarRepository>();

            mock.Setup(m => m.Cars).Returns(new Car[]
            {
                new Car {
                    CarID = 1, Model = "F", Brand = "B1", Category = "", PricePerDay = 200
                },
                new Car {
                    CarID = 2, Model = "B", Brand = "B2", Category = "", PricePerDay = 100
                },
                new Car {
                    CarID = 3, Model = "D", Brand = "B3", Category = "", PricePerDay = 50
                },
                new Car {
                    CarID = 4, Model = "A", Brand = "B1", Category = "", PricePerDay = 500
                },
                new Car {
                    CarID = 5, Model = "G", Brand = "B5", Category = "", PricePerDay = 150
                }
            });
            CarController controller = new CarController(mock.Object);

            CarSearch carSearch = new CarSearch {
                Sort = "PriceUp"
            };

            //działanie
            CarsListMainModel result = (CarsListMainModel)controller.List(carSearch, 1).Model;

            Car[] carArray = result.CarListViewModel.Cars.ToArray();


            //asercje
            Assert.IsTrue(carArray.Length == 5);
            Assert.AreEqual(carArray[0].CarID, 3);
            Assert.AreEqual(carArray[1].CarID, 2);
            Assert.AreEqual(carArray[2].CarID, 5);
            Assert.AreEqual(carArray[3].CarID, 1);
            Assert.AreEqual(carArray[4].CarID, 4);
        }
Beispiel #15
0
        public void Can_Search_Strings()
        {
            //przygotowanie
            Mock <ICarRepository> mock = new Mock <ICarRepository>();

            mock.Setup(m => m.Cars).Returns(new Car[]
            {
                new Car {
                    CarID = 1, Model = "P1", Brand = "B1", Category = ""
                },
                new Car {
                    CarID = 2, Model = "P1", Brand = "B2", Category = ""
                },
                new Car {
                    CarID = 3, Model = "P2", Brand = "B3", Category = ""
                },
                new Car {
                    CarID = 4, Model = "P1", Brand = "B1", Category = ""
                },
                new Car {
                    CarID = 5, Model = "P2", Brand = "B5", Category = ""
                }
            });
            CarController controller = new CarController(mock.Object);

            CarSearch carSearch = new CarSearch {
                NameSearch = "P1", BrandSearch = "B1"
            };

            //działanie
            CarsListMainModel result = (CarsListMainModel)controller.List(carSearch, 1).Model;

            Car[] carArray = result.CarListViewModel.Cars.ToArray();

            //asercje
            Assert.IsTrue(carArray.Length == 2);
            Assert.AreEqual(carArray[0].CarID, 1);
            Assert.AreEqual(carArray[1].CarID, 4);
        }
Beispiel #16
0
        public ActionResult <SearchTicket> Post([FromBody] CarSearch carSearch, [FromServices] IConfiguration config)
        {
            //assign searchresult
            var uniqueKey = Guid.NewGuid();

            //start async search here
            Task.Run(() =>
            {
                var results = new SearchHandler(_context).StartCarSearch(carSearch);
                string data = JsonConvert.SerializeObject(results.ScrapeResults, Formatting.None);

                var searchData = new SearchData
                {
                    Key                 = uniqueKey,
                    Data                = data,
                    Exception           = results.RuntimeException?.Message,
                    SearchDurationInSec = results.DurationInSeconds
                };

                var util = new Util(config);
                using (var db = util.GetDbContext())
                {
                    db.SearchData.Add(searchData);
                    db.SaveChanges();
                }
            });

            var returnTicket = new SearchTicket
            {
                SearchKey            = uniqueKey.ToString(),
                RetryAfter           = Duration.ThirtySeconds,
                KeyRetrievalEndpoint = string.Format("{0}://{1}{2}{3}", Request.Scheme, Request.Host, Request.Path, Request.QueryString)?.ToLower().Replace("startsearch", "getresults")
            };

            return(new AcceptedResult("", returnTicket));
        }
Beispiel #17
0
        public PagedResponse <CarShowDto> Execute(CarSearch request)
        {
            var query = Context.Cars.AsQueryable();

            if (request.Name != null)
            {
                query.Where(c => c.Name.Contains(request.Name));
            }
            if (request.MinPrice != null && request.MaxPrice != null)
            {
                query.Where(c => c.Price >= request.MinPrice && c.Price <= request.MaxPrice);
            }
            if (request.ModelId != null)
            {
                query.Where(c => c.ModelId == request.ModelId);
            }
            if (request.TransmissionId != null)
            {
                query.Where(c => c.TransmissionId == request.TransmissionId);
            }
            if (request.FuelId != null)
            {
                query.Where(c => c.FuelId == request.FuelId);
            }
            if (request.EngineId != null)
            {
                query.Where(c => c.EngineId == request.EngineId);
            }

            query.Include(c => c.Engine)
            .Include(c => c.Model)
            .Include(c => c.Fuel)
            .Include(c => c.Transmission)
            .Include(c => c.CarEquipment)
            .ThenInclude(ce => ce.Equipment);

            query.Skip((request.PageNumber - 1) * request.PerPage).Take(request.PerPage);

            var totalCount = query.Count();

            var pagesCount = (int)Math.Ceiling((double)totalCount / request.PerPage);


            return(new PagedResponse <CarShowDto>
            {
                CurrentPage = request.PageNumber,
                PagesCount = pagesCount,
                TotalCount = totalCount,
                Data = query.Select(c => new CarShowDto {
                    Id = c.Id,
                    Name = c.Name,
                    Price = c.Price,
                    Model = c.Model.Name,
                    Engine = c.Engine.Name,
                    Fuel = c.Fuel.Type,
                    Src = c.Src,
                    Alt = c.Alt,
                    Transmission = c.Transmission.Type,
                    EquipmentNames = c.CarEquipment.Select(ce => ce.Equipment.Name)
                })
            });
        }
Beispiel #18
0
 public ViewResult Search(CarSearch searchModel)
 {
     return(View(searchModel));
 }
Beispiel #19
0
 public ActionResult SearchPost(CarSearch searchModel)
 {
     return(RedirectToAction("List", searchModel));
 }
Beispiel #20
0
        public Fsm(long chatId, Message msg, TelegramBotClient bot, Context db)
        {
            User state;

            lock (Locker)
            {
                state = db.Users.FirstOrDefault(x => x.ChatId == chatId);
            }

            if (state == null)
            {
                User user = new User
                {
                    ChatId = chatId,
                    State  = StateChatEnum.StartMain
                };
                db.Users.Add(user);
                db.SaveChanges();
            }

            if (state != null)
            {
                IUpdateState updateState;

                switch (state.State)
                {
                case StateChatEnum.StartMain:
                    var uid = db.Users.FirstOrDefault(x => x.ChatId == chatId);
                    if (uid == null)
                    {
                        User user = new User
                        {
                            ChatId = chatId,
                            State  = StateChatEnum.StartText
                        };

                        db.Users.Add(user);
                        db.SaveChanges();
                    }

                    updateState = new StartMain();
                    break;

                case StateChatEnum.EndAddress:
                    updateState = new EndAddress();
                    break;

                case StateChatEnum.StartText:
                    updateState = new StartText();
                    break;

                case StateChatEnum.SendingTime:
                    updateState = new SendingTime();
                    break;

                case StateChatEnum.SendingNumberPhone:
                    updateState = new SendingNumberPhone();
                    break;

                case StateChatEnum.PaymentMethod:
                    updateState = new PaymentMethod();
                    break;

                case StateChatEnum.CarSearch:
                    updateState = new CarSearch();
                    break;

                //case StateChatEnum.CarSearch:
                //	updateState = new CarSearch();
                //	break;

                default:
                    throw new AggregateException();
                }

                updateState.UpdateAsync(msg, bot, chatId, db);
            }
        }
 public Task <IList <Car> > Search(CarSearch search)
 {
     throw new NotImplementedException();
 }
Beispiel #22
0
        public ViewResult List(CarSearch searchModel, int page = 1)
        {
            var cars = repository.Cars;

            if (ModelState.IsValid)
            {
                if (searchModel.NameSearch == null)
                {
                    searchModel.NameSearch = "";
                }
                if (searchModel.BrandSearch == null)
                {
                    searchModel.BrandSearch = "";
                }
                if (searchModel.MaxPrice == 0)
                {
                    searchModel.MaxPrice = decimal.MaxValue;
                }
                if (searchModel.MaxYear == 0)
                {
                    searchModel.MaxYear = int.MaxValue;
                }
                if (searchModel.MaxMileage == 0)
                {
                    searchModel.MaxMileage = decimal.MaxValue;
                }
                if (searchModel.MaxCapacity == 0)
                {
                    searchModel.MaxCapacity = decimal.MaxValue;
                }
                if (searchModel.Category == null)
                {
                    searchModel.Category = "";
                }
                cars = from i in repository.Cars
                       where
                       i.Model.Contains(searchModel.NameSearch) &&
                       i.Brand.Contains(searchModel.BrandSearch) &&
                       i.PricePerDay >= searchModel.MinPrice &&
                       i.PricePerDay <= searchModel.MaxPrice &&
                       i.Mileage >= searchModel.MinMileage &&
                       i.Mileage <= searchModel.MaxMileage &&
                       i.Year >= searchModel.MinYear &&
                       i.Year <= searchModel.MaxYear &&
                       i.Capacity >= searchModel.MinCapacity &&
                       i.Capacity <= searchModel.MaxCapacity
                       select i;

                if (searchModel.Hired == "false")
                {
                    cars = cars.Where(p => p.Hired == true);
                }
                else if (searchModel.Hired == "true")
                {
                    cars = cars.Where(p => p.Hired == false);
                }

                if (searchModel.Category != "")
                {
                    cars = cars.Where(p => p.Category.Equals(searchModel.Category));
                }

                if (searchModel.Sort == "ModelUp")
                {
                    cars = cars.OrderBy(p => p.Model);
                }
                else if (searchModel.Sort == "ModelDown")
                {
                    cars = cars.OrderByDescending(p => p.Model);
                }
                else if (searchModel.Sort == "BrandUp")
                {
                    cars = cars.OrderBy(p => p.Brand);
                }
                else if (searchModel.Sort == "BrandDown")
                {
                    cars = cars.OrderByDescending(p => p.Brand);
                }
                else if (searchModel.Sort == "PriceUp")
                {
                    cars = cars.OrderBy(p => p.PricePerDay);
                }
                else if (searchModel.Sort == "PriceDown")
                {
                    cars = cars.OrderByDescending(p => p.PricePerDay);
                }
                else if (searchModel.Sort == "YearUp")
                {
                    cars = cars.OrderBy(p => p.Year);
                }
                else if (searchModel.Sort == "YearDown")
                {
                    cars = cars.OrderByDescending(p => p.Year);
                }
                else if (searchModel.Sort == "MileageUp")
                {
                    cars = cars.OrderBy(p => p.Mileage);
                }
                else if (searchModel.Sort == "MileageDown")
                {
                    cars = cars.OrderByDescending(p => p.Mileage);
                }
                else if (searchModel.Sort == "CapacityUp")
                {
                    cars = cars.OrderBy(p => p.Capacity);
                }
                else if (searchModel.Sort == "CapacityDown")
                {
                    cars = cars.OrderByDescending(p => p.Capacity);
                }
                else
                {
                    cars = cars.OrderBy(p => p.CarID);
                }
            }
            var totalCars = cars.Count();

            cars = cars.Skip((page - 1) * PageSize);
            cars = cars.Take(PageSize);

            var model = new CarsListMainModel
            {
                CarListViewModel = new CarsListViewModel
                {
                    Cars       = cars,
                    PagingInfo = new PagingInfo
                    {
                        CurrentPage = page,
                        CarsPerPage = PageSize,
                        TotalCars   = totalCars
                    }
                },
                CarSearch = searchModel
            };

            return(View(model));
        }
Beispiel #23
0
        public async Task <Object> GetSearchedCars(CarSearch carSearch)
        {
            List <Vehicle> cars = new List <Vehicle>();

            try
            {
                if (carSearch.RentacarID != null)
                {
                    if (carSearch.BranchID != null)
                    {
                        cars = _dataBase.Vehicles.Where(v => v.RentacarID == carSearch.RentacarID && v.BranchID == carSearch.BranchID).Include(v => v.DatesTaken).ToList();
                    }
                    else
                    {
                        cars = _dataBase.Vehicles.Where(v => v.RentacarID == carSearch.RentacarID).Include(v => v.DatesTaken).ToList();
                    }
                }
                else
                {
                    cars = _dataBase.Vehicles.Include(v => v.DatesTaken).ToList();
                }
            }
            catch (Exception ex)
            {
                return(BadRequest(ex.Message));
            }
            await Task.Run(() =>
            {
                int counter = 0;
                if (carSearch.CityOT != null)
                {
                    cars.RemoveAll(v => !carSearch.CityOT.ToLower().Contains(_dataBase.Locations.Find(_dataBase.Branches.Find(v.BranchID).LocationID).NameOfCity.ToLower()));
                }
                if (carSearch.DateOR != null)
                {
                    for (var d = DateTime.Parse(carSearch.DateOT); d <= DateTime.Parse(carSearch.DateOR); d = d.AddDays(1))
                    {
                        ++counter;
                        cars.RemoveAll(v => v.DatesTaken.ToList().Find(date => date.DateTime == d) != null);
                    }
                }
                else if (carSearch.DateOT != null)
                {
                    cars.RemoveAll(v => v.DatesTaken.ToList().Find(date => date.DateTime == DateTime.Parse(carSearch.DateOT)) != null);
                }
                counter = counter != 0 ? counter : 1;
                if (carSearch.MPrice != null)
                {
                    cars.RemoveAll(v => carSearch.MPrice < v.PricePerDay *counter);
                }
                if (carSearch.Type != null)
                {
                    cars.RemoveAll(v => carSearch.Type != v.TypeOfVehicle);
                }
                if (carSearch.Seats != null)
                {
                    cars.RemoveAll(v => carSearch.Seats != v.NumberOfSeats);
                }
            });

            return(Ok(cars));
        }
        public async Task <List <Vehicle> > GetVehiclesBySearch(CarSearch searchParameters)
        {
            List <Vehicle> retVal = new List <Vehicle>();

            if (searchParameters.PickUpDate < DateTime.Now)
            {
                return(retVal);
            }

            if (searchParameters.PickUpDate > searchParameters.ReturnDate)
            {
                return(retVal);
            }

            if (searchParameters.PickUpDate == searchParameters.ReturnDate)
            {
                if (searchParameters.PickUpTime >= searchParameters.ReturnTime)
                {
                    return(retVal);
                }
            }

            var vehicles = await _repository.GetAllVehicles();

            foreach (Vehicle v in vehicles)
            {
                if (v.CarType == searchParameters.CarType && v.Passangers >= searchParameters.Passangers)
                {
                    var company = await _companyRepository.GetCompany(v.CarCompanyId);

                    var pickUpLocationExists = company.Offices.SingleOrDefault(o => o.Location.Name == searchParameters.PickUpLocation) != null;
                    var returnLocationExists = company.Offices.SingleOrDefault(o => o.Location.Name == searchParameters.ReturnLocation) != null;

                    if (pickUpLocationExists && returnLocationExists)
                    {
                        var allCarReservations = await _companyRepository.GetCarReservationsByCompanyId(v.CarCompanyId);

                        if (allCarReservations != null)
                        {
                            var reservations = allCarReservations.Where(cr => cr.VehicleId == v.VehicleId);

                            DateTime pickUpDate = searchParameters.PickUpDate.Add(searchParameters.PickUpTime.TimeOfDay);
                            DateTime returnDate = searchParameters.ReturnDate.Add(searchParameters.ReturnTime.TimeOfDay);
                            bool     available  = true;
                            foreach (CarReservation r in reservations)
                            {
                                // rp    p     rr     r
                                if (r.PickUpDate < pickUpDate && r.ReturnDate > pickUpDate)
                                {
                                    available = false;
                                    break;
                                }

                                // p     rp    r     rr
                                if (r.PickUpDate > pickUpDate && r.PickUpDate < returnDate)
                                {
                                    available = false;
                                    break;
                                }

                                if (r.PickUpDate == pickUpDate && r.ReturnDate == returnDate)
                                {
                                    available = false;
                                    break;
                                }
                            }

                            if (available)
                            {
                                retVal.Add(v);
                            }
                        }
                        else
                        {
                            retVal.Add(v);
                        }
                    }
                }
            }

            return(retVal);
        }