public List <AvailableVehiculeViewModel> GetAvailableVehiculeForLocation(Location location)
        {
            // on prend tout les vehicules qui n'ont pas l'état à Supprimé et à Maintenance
            List <Vehicle> vehicleList = _context.Vehicle.Where(x => x.VehState != (sbyte)Enums.VehiculeState.Deleted && x.VehState != (sbyte)Enums.VehiculeState.Maintenance).ToList();

            List <Vehicle> preselectedVehicles = new List <Vehicle>();

            foreach (Vehicle vehicle in vehicleList)
            {
                vehicle.Location = _context.Location.Where(l => l.LocVehId == vehicle.VehId).ToList();
            }

            foreach (Vehicle vehicle in vehicleList)
            {
                // Si aucune loc ne respecte les 3 conditions suivantes, on ajoute le vehicule à la liste
                // loc commence avant et fini après la loc demandée
                // loc fini pendant la loc demandée
                // loc commence pendant la loc demandée
                if (vehicle.Location == null)
                {
                    preselectedVehicles.Add(vehicle);
                }
                else
                {
                    if (vehicle.Location.Where(l => l.LocDatestartlocation <= location.LocDatestartlocation && l.LocDateendlocation >= location.LocDateendlocation).Count() == 0)
                    {
                        if (vehicle.Location.Where(l => l.LocDateendlocation <= location.LocDatestartlocation && l.LocDateendlocation >= location.LocDatestartlocation).Count() == 0)
                        {
                            if (vehicle.Location.Where(l => l.LocDateendlocation <= location.LocDatestartlocation && l.LocDateendlocation >= location.LocDatestartlocation).Count() == 0)
                            {
                                if (vehicle.Location.Where(l => l.LocDatestartlocation >= location.LocDatestartlocation && l.LocDatestartlocation <= location.LocDateendlocation).Count() == 0)
                                {
                                    preselectedVehicles.Add(vehicle);
                                }
                            }
                        }
                    }
                }
            }
            List <Vehicle> selectedVehicles = new List <Vehicle>();

            if (preselectedVehicles.Count > 0)
            {
                Location lastLoc, nextLoc = new Location();
                foreach (Vehicle vehicle in preselectedVehicles)
                {
                    List <Location> locs = vehicle.Location.Where(l => l.LocDateendlocation < location.LocDatestartlocation).ToList();
                    if (locs.Count == 0)
                    {
                        if (vehicle.VehPoleId == location.LocPoleIdstart)
                        {
                            selectedVehicles.Add(vehicle);
                        }
                    }
                    else
                    {
                        lastLoc = locs.Where(l => l.LocDateendlocation < location.LocDatestartlocation).OrderByDescending(l => l.LocDateendlocation).First();
                        nextLoc = locs.Where(l => l.LocDatestartlocation < location.LocDateendlocation).OrderBy(l => l.LocDatestartlocation).First();

                        if (lastLoc.LocPoleIdend != null)
                        {
                            if (nextLoc.LocPoleIdstart == location.LocPoleIdend)
                            {
                                selectedVehicles.Add(vehicle);
                                continue;
                            }
                        }
                        if (nextLoc.LocPoleIdend != null)
                        {
                            if (lastLoc.LocPoleIdend == location.LocPoleIdstart)
                            {
                                selectedVehicles.Add(vehicle);
                                continue;
                            }
                        }
                        if (lastLoc.LocPoleIdend == location.LocPoleIdstart && nextLoc.LocPoleIdstart == location.LocPoleIdend)
                        {
                            selectedVehicles.Add(vehicle);
                            continue;
                        }
                    }
                }
            }
            List <AvailableVehiculeViewModel> availableVehicules = new List <AvailableVehiculeViewModel>();

            //construct viewModels
            foreach (Vehicle vehicle in selectedVehicles)
            {
                AvailableVehiculeViewModel available = new AvailableVehiculeViewModel()
                {
                    VehId         = vehicle.VehId,
                    Registration  = vehicle.VehRegistration,
                    VehCommonName = vehicle.VehBrand + " - " + vehicle.VehModel
                };
                availableVehicules.Add(available);
            }
            return(availableVehicules);
        }
Exemple #2
0
        private List <AvailableVehiculeViewModel> GetAvailableVehiculeForLocation(Location location)
        {
            List <Vehicle> listAllVehicule = _context.Vehicle.ToList();

            // on ajoutera a cette liste tout les vehicules qui respecteront pas les conditions pour être valide a cette location
            List <int> listVehiculeNonDisponible = new List <int>();

            //On regarde pour chaque vehicule les locations qu'il a déja
            foreach (Vehicle vehicule in listAllVehicule)
            {
                // Gestion du cas ou le véhicule n'a pas encore de reservation il faut donc regarder le pole du vehicule directement
                if (_context.Location.Count(x => x.LocVehId == vehicule.VehId) == 0 && vehicule.VehPoleId != location.LocPoleIdstart)
                {
                    if (!listVehiculeNonDisponible.Contains(vehicule.VehId))
                    {
                        listVehiculeNonDisponible.Add(vehicule.VehId);
                    }
                }

                //la liste des reservations du premier vehicule de la liste, puis du second etc
                List <Location> listDeslocationDuVehicule = _context.Location.Where(x => x.LocVehId == vehicule.VehId).ToList();

                //Pour chaque location de ce vehicule on va regarder les dates de ces reservations
                foreach (Location locationDuVehicule in listDeslocationDuVehicule)
                {
                    // première condition
                    // si il a une location qui débute avant la location en cours alors le vehicule n'est pas dispo
                    if (locationDuVehicule.LocDatestartlocation < location.LocDatestartlocation && locationDuVehicule.LocDateendlocation > location.LocDatestartlocation)
                    {
                        // si le vehicule n'est pas déja dans la liste des vehicules non dispo
                        if (!listVehiculeNonDisponible.Contains(locationDuVehicule.LocVehId.GetValueOrDefault()))
                        {
                            listVehiculeNonDisponible.Add(locationDuVehicule.LocVehId.GetValueOrDefault());
                        }
                    }

                    // 2 eme condition
                    // On regarde ces reservations et si il en aune qui finit après la date de fin de la location en cours alors le vehicule n'est pas disponible
                    // et on l'ajoute à la liste
                    if (locationDuVehicule.LocDateendlocation > location.LocDateendlocation)
                    {
                        // si le vehicule n'est pas déja dans la liste des vehicules non dispo
                        if (!listVehiculeNonDisponible.Contains(locationDuVehicule.LocVehId.GetValueOrDefault()))
                        {
                            listVehiculeNonDisponible.Add(locationDuVehicule.LocVehId.GetValueOrDefault());
                        }
                    }

                    // 3 eme condition
                    // si la date d'une des reservations debute après la date de debut de la location en cours et que en plus la date de la reservation finit avant la date de la location
                    // alors le vehicule n'est pas disponible
                    if (locationDuVehicule.LocDatestartlocation > location.LocDatestartlocation &&
                        locationDuVehicule.LocDateendlocation < location.LocDateendlocation)
                    {
                        if (!listVehiculeNonDisponible.Contains(locationDuVehicule.LocVehId.GetValueOrDefault()))
                        {
                            listVehiculeNonDisponible.Add(locationDuVehicule.LocVehId.GetValueOrDefault());
                        }
                    }

                    // 4 eme condition
                    // si la date d'une des reservations debute avant la location en cours et finit après la date de fin de la location en cours
                    if (locationDuVehicule.LocDatestartlocation < location.LocDatestartlocation &&
                        locationDuVehicule.LocDateendlocation > location.LocDateendlocation)
                    {
                        if (!listVehiculeNonDisponible.Contains(locationDuVehicule.LocVehId.GetValueOrDefault()))
                        {
                            listVehiculeNonDisponible.Add(locationDuVehicule.LocVehId.GetValueOrDefault());
                        }
                    }

                    //todo ajouter les conditions sur les pôles
                    // 5 eme condition sur les pôles
                    // Si la date de fin des locations du vehicule finissent entre aujourd'hui et la date de debut de la location alors on regarde si son pole dernier pole d'arrive (de la voiture) correspond au pole de depart de la location
                    if (locationDuVehicule.LocDateendlocation >= DateTime.Now.ToLocalTime() &&
                        locationDuVehicule.LocDateendlocation <= location.LocDatestartlocation)
                    {
                        // on recupère la dernière location pour cette voiture pour verifier le dernier pole  d'arrive de la voiture connu
                        Location derniereLocDuVehicule = _context.Location.Where(x => x.LocVehId == locationDuVehicule.LocVehId && x.LocDatestartlocation >= DateTime.Now)
                                                         .OrderBy(x => x.LocDateendlocation).FirstOrDefault();


                        //alors on regarde si son pole d'arrive correspond au pole de depart
                        if (derniereLocDuVehicule != null && derniereLocDuVehicule.LocPoleIdend != location.LocPoleIdstart)
                        {
                            listVehiculeNonDisponible.Add(locationDuVehicule.LocVehId.GetValueOrDefault());
                        }
                    }
                }
            }
            // on construit maintenant la liste des vehicules disponible en prenant tout les vehicules en base en enlevant ceux present dans la liste listVehiculeNonDisponible
            List <AvailableVehiculeViewModel> listDesVehiculeDispo = new List <AvailableVehiculeViewModel>();

            foreach (var vehicule in listAllVehicule)
            {
                if (!listVehiculeNonDisponible.Contains(vehicule.VehId))
                {
                    AvailableVehiculeViewModel vehiculeModel = new AvailableVehiculeViewModel()
                    {
                        VehId         = vehicule.VehId,
                        Registration  = vehicule.VehRegistration,
                        VehCommonName = vehicule.VehBrand + " " + vehicule.VehModel
                    };
                    listDesVehiculeDispo.Add(vehiculeModel);
                }
            }

            return(listDesVehiculeDispo);
        }