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); }
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()); }
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); }
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(); }