public IEnumerable <FreeHotelRoomDTO> SearchFreeRooms(HotelRoomSeachFilterDTO filter)
        {
            if (filter is null)
            {
                throw new ArgumentNullException("filter");
            }

            TypeComfortEnum comfort = Mapper.Map <TypeComfortEnum>(filter.TypeComfort);
            TypeSizeEnum    size    = Mapper.Map <TypeSizeEnum>(filter.TypeSize);
            var             rooms   = UnitOfWork.HotelRooms.FindFreeRooms(filter.CheckInDate, size, comfort);

            List <FreeHotelRoomDTO> result = new List <FreeHotelRoomDTO>();

            if (!rooms.Any())  // rooms.Count() не гуд, потому что будет перебирать всю колекцию
            {
                return(result);
            }

            foreach (var room in rooms) // search for a period of time the room is free
            {
                DateTime?minDate = null;
                foreach (var date in room.ActiveOrders)
                {
                    if (date.ChecknInDate > filter.CheckInDate && (minDate is null || minDate > date.ChecknInDate))
                    {
                        minDate = date.ChecknInDate;
                    }
                }
                var temp = Mapper.Map <HotelRoom, FreeHotelRoomDTO>(room);
                temp.CheckInDate     = filter.CheckInDate;
                temp.MaxCheckOutDate = minDate;
                result.Add(temp);
            }
            return(result);
        }
Example #2
0
        private IEnumerable <HotelRoom> FreeRoomsFilter(HotelRoomSeachFilterDTO filter)
        {
            TypeComfortEnum        comfort = Mapper.Map <TypeComfortEnum>(filter.TypeComfort);
            TypeSizeEnum           size    = Mapper.Map <TypeSizeEnum>(filter.TypeSize);
            IQueryable <HotelRoom> rooms   = UnitOfWork.HotelRooms.GetQuery().Include(p => p.TypeComfort).Include(p => p.TypeSize).Include(p => p.ActiveOrders);

            if (filter.HotelId != 0)
            {
                rooms = rooms.Where(p => p.HotelId == filter.HotelId);
            }
            if (size != 0)
            {
                rooms = rooms.Where(p => p.TypeSize.Size == size);
            }
            if (comfort != 0)
            {
                rooms = rooms.Where(p => p.TypeComfort.Comfort == comfort);
            }
            if (filter.CheckOutDate is null)
            {
                rooms = rooms.Where(p => p.ActiveOrders.All(t => t.CheckInDate > filter.CheckInDate || t.CheckOutDate <= filter.CheckInDate));
            }
            else
            {
                rooms = rooms.Where(p => p.ActiveOrders.All(t => (filter.CheckInDate > t.CheckInDate && filter.CheckInDate >= t.CheckOutDate) || (filter.CheckOutDate <= t.CheckInDate && filter.CheckOutDate < t.CheckOutDate)));
            }
            return(rooms.AsNoTracking().ToList());
        }
Example #3
0
        public IEnumerable <FreeHotelRoomDTO> SearchFreeRooms(HotelRoomSeachFilterDTO filter)
        {
            if (filter is null)
            {
                throw new ArgumentNullException(nameof(filter));
            }

            IEnumerable <HotelRoom> rooms = FreeRoomsFilter(filter);

            List <FreeHotelRoomDTO> result = new List <FreeHotelRoomDTO>();

            if (!rooms.Any())  // rooms.Count() не гуд, потому что будет перебирать всю колекцию
            {
                return(result);
            }

            if (!(filter.CheckOutDate is null))
            {
                result = Mapper.Map <IEnumerable <HotelRoom>, List <FreeHotelRoomDTO> >(rooms);
                foreach (var room in result)
                {
                    room.CheckInDate     = filter.CheckInDate;
                    room.MaxCheckOutDate = filter.CheckOutDate;
                }
                return(result);
            }

            foreach (var room in rooms) // search for a period of time the room is free
            {
                DateTime?minDate = null;
                foreach (var date in room.ActiveOrders)
                {
                    if (date.CheckInDate > filter.CheckInDate && (minDate is null || minDate > date.CheckInDate))
                    {
                        minDate = date.CheckInDate;
                    }
                }
                var temp = Mapper.Map <HotelRoom, FreeHotelRoomDTO>(room);
                temp.CheckInDate     = filter.CheckInDate;
                temp.MaxCheckOutDate = minDate;
                result.Add(temp);
            }
            return(result);
        }
Example #4
0
        public static void MakeOrder(IHotelService service)
        {
            int inputInt;

            Console.WriteLine("Такс заполните форму для поиска нужной комнаты");
            HotelRoomSeachFilterDTO roomFilter = new HotelRoomSeachFilterDTO();

            Console.WriteLine("Какого типа комфорта вы желаете?\n1 - Standart, 2 - Suite, 3 - De_Luxe, 4 - Duplex, 5 - Family_Room, 6 - Honeymoon_Room, 0 - Not important");
            while (true)
            {
                Console.Write("Введите номер: ");
                if (int.TryParse(Console.ReadLine(), out inputInt))
                {
                    if (inputInt >= 0 && inputInt <= 6)
                    {
                        break;
                    }
                }
                Console.WriteLine("Try again");
                continue;
            }
            roomFilter.TypeComfort = (TypeComfortEnumDTO)inputInt;

            Console.WriteLine("Какого типа размера вы желаете?\n1 - SGL, 2 - DBL, 3- DBL_TWN, 4 - TRPL, 5 - DBL_EXB, 6 - TRPL_EXB, 0 - Not important");
            while (true)
            {
                Console.Write("Введите номер: ");
                if (int.TryParse(Console.ReadLine(), out inputInt))
                {
                    if (inputInt >= 0 && inputInt <= 6)
                    {
                        break;
                    }
                }
                Console.WriteLine("Try again");
                continue;
            }
            roomFilter.TypeSize = (TypeSizeEnumDTO)inputInt;

            Console.WriteLine("На которую дату хотите заселится?");
            Console.Write("Год: ");
            int year = int.Parse(Console.ReadLine());

            Console.Write("Месяц: ");
            int month = int.Parse(Console.ReadLine());

            Console.Write("День: ");
            int day = int.Parse(Console.ReadLine());

            roomFilter.CheckInDate = new DateTime(year, month, day);

            var rooms = service.SearchFreeRooms(roomFilter);

            if (!rooms.Any())
            {
                Console.WriteLine("К сожалению свободных подобных комнат нет на данную дату");
            }
            else
            {
                Console.WriteLine("Найденные комнаты:");
                foreach (var t in rooms)
                {
                    Console.WriteLine("Номер: " + t.Number + " Цена за день: " + t.PricePerDay + " Комфорт: " + t.TypeComfort.ToString() + " Размер: " + t.TypeSize.ToString() + " Дата заезда: " + t.CheckInDate + " Макс дата отъезда: " + t.MaxCheckOutDate);
                }

                FreeHotelRoomDTO room;
                string           inputString;
                while (true)
                {
                    Console.Write("Какой номер предпочитаете: ");
                    inputString = Console.ReadLine();
                    room        = rooms.SingleOrDefault(p => p.Number == inputString);
                    if (!(room is null))
                    {
                        break;
                    }
                    Console.WriteLine("У Вас проблемы с цифрами)))  Try Again");
                    continue;
                }

                ActiveOrderDTO order = new ActiveOrderDTO();
                order.HotelRoomId  = room.HotelRoomId;
                order.ChecknInDate = room.CheckInDate;
                Console.Write("На которое количество дней: ");
                int days = int.Parse(Console.ReadLine());
                order.CheckOutDate = room.CheckInDate.AddDays(days);
                //order.DateRegistration = DateTime.Now;

                ClientDTO client = new ClientDTO();
                Console.Write("Ваше имя: ");
                inputString      = Console.ReadLine();
                client.FirstName = inputString;
                Console.Write("Ваша фамилия: ");
                inputString     = Console.ReadLine();
                client.LastName = inputString;
                Console.Write("Ваш номер телефона: ");
                inputString        = Console.ReadLine();
                client.PhoneNumber = inputString;
                //order.Client = client;

                Console.Write("Бронь или оплата: 1 - Paid, 2 - Booked\n");
                while (true)
                {
                    Console.Write("Введите номер: ");
                    if (int.TryParse(Console.ReadLine(), out inputInt))
                    {
                        if (inputInt >= 1 && inputInt <= 2)
                        {
                            break;
                        }
                    }
                    Console.WriteLine("Try again");
                    continue;
                }
                order.PaymentState = (PaymentStateEnumDTO)inputInt;

                service.AddClientActiveOrder(order, client);
            }
            service.Dispose();
        }