Asp Mvc rezerwacje - sprawdzanie wolnego terminu

0

Cześć, robię w celu nauki aplikacje internetowa której głównym zadaniem będzie rezerwacja escape roomu/hotelu(w zasadzie czegokolwiek). O ile z samym przeglądaniem, panelem administracyjnym czy logowaniem jakoś sobie poradziłem/poradzę, to mam problem z sprawdzeniem czy dany termin jest wolny. Nie mam zielonego pojęcia jak do tego podejść. Moje wszystkie marne próby spaliły na panewce. Może trafił ktoś na jakiś materiał dotyczący tego problemu albo byłby w stanie nakierować na prawidłowe tory. Byłbym wdzięczny za każdą pomoc.
Pozdrawiam

0

czyli... masz problem ze znalezieniem danych dot. tego czy X w danym dniu jest wolny?

"Booking API" "Hotel API"

http://www.travelotas.com/travel-api-providers/hotel-api-provider/

A jak nie ma nic fajnego, to chyba trzeba będzie scrapować :P

0
WeiXiao napisał(a):

czyli... masz problem ze znalezieniem danych dot. tego czy X w danym dniu jest wolny?

"Booking API" "Hotel API"

http://www.travelotas.com/travel-api-providers/hotel-api-provider/

A jak nie ma nic fajnego, to chyba trzeba będzie scrapować :P

Stawiam pierwsze kroki w asp core, także przedstawie może swój tok myślenia. Użytkownik podaje daty rezerwacji np. pokoju w danych dniach. Mam klasę Reservation, zawierającą informacje m.in o datach rezerwacji, cenie, pokoju który jest zarezerwowany itp. Do tego klasę CheckReservation która zawiera informacje o dacie i ilości osób. Plan jest żeby użytkownik na wejściu podał na ile osób chce rezerwacje i daty które go interesują i po kliknięciu "Check" aplikacja zakręci kołem i wyrzuci listę wolnych pokoi. W zasadzie wydaje mi się że muszę przewertować tabele Reservation i porównywać wartości w kolumnach data/pokój/liczba osób. Pytanie moje jak (póki co korzystałem z raczej standardowych funkcji) coś takiego wykonać ? I czy robić to po stronie modelu czy controlera ? To "Booking API" czy też WebAPi to dla mnie science fiction ale spróbuje się zainteresować tematem po pracy :).

0

Nie wiem jak wyglądają twoje klasy, więc zgaduje :D

DateTime data = DateTime.Now;
var reservations = Reservations.Where(x => x.DataOd >= data && x.DataDo <= data);
if(reservations.Count != 0)
{
   List<int> roomsIds = reservations.Select(x=>x.RoomID).ToList<int>();
   var rooms = Rooms.Where(x => !roomsIds.Contains(x.ID); // <=== Wolne pokoje
}

Może da się to prościej zrobić. To jest pierwsze co mi do głowy przyszło...

1
AdamWox napisał(a):

Nie wiem jak wyglądają twoje klasy, więc zgaduje :D

DateTime data = DateTime.Now;
var reservations = Reservations.Where(x => x.DataOd >= data && x.DataDo <= data);
if(reservations.Count != 0)
{
   List<int> roomsIds = reservations.Select(x=>x.RoomID).ToList<int>();
   var rooms = Rooms.Where(x => !roomsIds.Contains(x.ID); // <=== Wolne pokoje
}

Może da się to prościej zrobić. To jest pierwsze co mi do głowy przyszło...

Tak na szybko to wydaje mi się, że tu

var reservations = Reservations.Where(x => x.DataOd >= data && x.DataDo <= data); 

zawsze będzie pusto

1
AdamWox napisał(a):

Nie wiem jak wyglądają twoje klasy, więc zgaduje :D

DateTime data = DateTime.Now;
var reservations = Reservations.Where(x => x.DataOd >= data && x.DataDo <= data);
if(reservations.Count != 0)
{
   List<int> roomsIds = reservations.Select(x=>x.RoomID).ToList<int>();
   var rooms = Rooms.Where(x => !roomsIds.Contains(x.ID); // <=== Wolne pokoje
}

Może da się to prościej zrobić. To jest pierwsze co mi do głowy przyszło...

Z czystej ciekawości, dlaczego raz jest DateTime, raz var, raz List<int>, potem znowu var?

1

Wyszedłem z założenia, że kolumny daty są typu DateTime, a kolumna ID jest typu int. W związku z tym, że nie wiem jak się nazywają jego klasy (reprezentacje tabel) to użyłem var.
Ta forma też jest poprawna i działa tak samo.

var data = DateTime.Now;
var reservations = Reservations.Where(x => x.DataOd >= data && x.DataDo <= data);
if(reservations.Count != 0)
{
   var roomsIds = reservations.Select(x=>x.RoomID).ToList<int>();
   var rooms = Rooms.Where(x => !roomsIds.Contains(x.ID); // <=== Wolne pokoje
}
2

Jeśli w tabeli rezerwacje mamy np Od 20.05 do 26.05. to zapytanie

var reservations = Reservations.Where(x => x.DataOd >= 23.05 && x.DataDo <= 23.05)

nic nie zwróci.

Więc powinno moim zdaniem być:

var reservations = Reservations.Where(x => x.DataOd <= 23.05 && x.DataDo >= 23.05)

Ale to jest tylko część rozwiązania. Bo przecież przy rezerwacjach szukamy przedziału. Więc od siebie też powinniśmy podawać przedział. I sprawdzać czy:
DataOd jest w naszym przedziale.
DataDo jest naszym przedziale
DataOd oraz DataDo są jednoczenie po za naszym przedziałem ale po przeciwnych stronach

0

Panowie, próbuje to zaimplementować ale idzie jak krew z nosa.

Mam 2 klasy:

    public class Room
    {
        [Required]
        public int RoomID { get; set; }
        [Required]
        public int RoomNumber { get; set; }
        [Required]
        public string Description { get; set; }
        [Required]
        public decimal Price { get; set; }
        [Required]
        public int RoomSize { get; set; }

        public virtual ICollection<Reservation> Reservations { get; set; }
    }

oraz

    public class Reservation
    {
        public long ReservationID { get; set; }

        public int RoomID { get; set; }

        [Required]
        [UIHint("Date")]
        public DateTime StartDate { get; set; }

        [Required]
        [UIHint("Date")]
        public DateTime EndDate { get; set; }

        [Required]
        public int GuestNumber { get; set; }

        public decimal Bill { get; set; }

        public virtual Room Room { get; set; }
    }

i kontroler rezerwacji

    public class ReservationController : Controller
    {
        private IReservationRepository repository;

        public ReservationController(IReservationRepository repo)
        {
            repository = repo;
        }

        public IActionResult AllReservation()
        {
            
            return View(repository.Reservations);
        }

        public IActionResult CheckBooking()
        {
            return View("CheckBooking", new CheckReservation { StartDate = DateTime.Now.AddDays(1), EndDate = DateTime.Now.AddDays(2), GuestNumber = 1 });
        }

    }

Moje wypociny wyglądają tak:

        public ViewResult ShowFreeRoom(Reservation reservation)
        {
            DateTime DataOd = reservation.StartDate;
            DateTime DataDo = reservation.EndDate;
            int IloscOsob = reservation.GuestNumber;

            var reservations = repository.Reservations.Where(x => x.StartDate >= DataOd && x.EndDate <= DataDo);
            if (reservations.Count != 0)
            {
                var roomsIds = reservation.Select(x => x.RoomID).ToList<int>();
                var rooms = Room.Where(x => !roomsIds.Contains(x.ID); // <=== Wolne pokoje
            }

            //return View();
        }

Wiem że zapytanie tak jak powiedział @szydlak nie jest kompletne, ale jest to chyba najmniejszy problem. Szczerze powiedziawszy to ciężko mi to na razie zrozumieć.

Dzięki za pomoc i pozdrawiam.

0

A takie coś?

        repository.Reservations.AddRange(new List<Reservations>
            {
                new Reservations {StartDate = DateTime.Now.AddDays(-1), EndDate = DateTime.Now.AddDays(1)},
                new Reservations {StartDate = DateTime.Now.AddDays(-1), EndDate = DateTime.Now},
                new Reservations {StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(1)},
                new Reservations {StartDate = DateTime.Now.AddDays(-2), EndDate = DateTime.Now.AddDays(2)},
                new Reservations {StartDate = DateTime.Now.AddDays(-2), EndDate = DateTime.Now.AddDays(-1)},
                new Reservations {StartDate = DateTime.Now.AddDays(-3), EndDate = DateTime.Now.AddDays(-2)}, //free 
                new Reservations {StartDate = DateTime.Now.AddDays(2), EndDate = DateTime.Now.AddDays(3)} //free
            });

            var fromDate = DateTime.Now.AddDays(-1);
            var toDate = DateTime.Now.AddDays(1);


            var reservation = repository.Reservations.Where(x =>(x.StartDate > fromDate && x.StartDate > toDate ) || (x.EndDate < fromDate && x.EndDate < toDate));
0

Po ciężkich bojach i przede wszystkim waszych poradach stworzyłem coś takiego(przepraszam za rozjechany kod). Brakuje jeszcze sprawdzenia po ilości osób, ale to już formalność :). Przetestuje jeszcze czy na pewno wszystko dobrze działa, ale wygląda obiecująco. Dzięki za pomoc !

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("StartDate,EndDate,GuestNumber")] Reservation reservation)
        {
            var res = _context.Reservations.Where(x => (x.StartDate >= reservation.StartDate && x.StartDate <= reservation.EndDate) || (x.EndDate >= reservation.StartDate && x.EndDate <= 
            reservation.EndDate) || (reservation.StartDate >= x.StartDate && reservation.StartDate <= x.EndDate) || (reservation.EndDate >= x.StartDate && reservation.EndDate <= x.EndDate));
            List<int> roomsIds = res.Select(x => x.RoomID).ToList<int>();
            var rooms = _context.Rooms.Where(x => !roomsIds.Contains(x.RoomID));
            if (rooms.Count() != 0)
            {
                return View("RoomList", rooms.Include(r=>r.Reservations).ToList());
            }

            return View(reservation);
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1