public booking GetBooking(int id, int userId, int apartmentId, int dateFrom, int dateTo)
 {
     Models.apartma2Entities entities = new Models.apartma2Entities();
     try
     {
         Models.booking bookingModel = entities.bookings.FirstOrDefault(el => el.id.Equals(id) || el.customer_trr.Equals(userId) || el.apartment.id.Equals(apartmentId) ||
                                                                        (el.date_from >= dateFrom && el.date_to <= dateTo));
         if (bookingModel != null)
         {
             booking bookingObj = new booking
             {
                 id        = bookingModel.id,
                 date_from = bookingModel.date_from,
                 date_to   = bookingModel.date_to,
                 //customer = ApartmentTypeConverter.CustomerModelToObj(bookingModel.customer),
                 apartment = ApartmentTypeConverter.ApartmentModelToObj(bookingModel.apartment),
                 status    = ApartmentTypeConverter.BookingStatusStringToEnum(bookingModel.status),
                 discount  = ApartmentTypeConverter.DiscountModelToObj(bookingModel.discount),
                 payment   = ApartmentTypeConverter.PaymentModelToObj(bookingModel.payment_method)
             };
             return(bookingObj);
         }
         else
         {
             return(null);
         }
     }
     catch (Exception ex)
     {
         return(null);
     }
 }
        public List <Types.apartment> Search(int dateFrom, int dateTo, int numOfBeds)
        {
            Models.apartma2Entities entities = new Models.apartma2Entities();
            try
            {
                List <Models.apartment> result = entities.apartments.ToList();

                if (numOfBeds != -1)
                {
                    result = entities.apartments.Where(ap => ap.no_single_beds + ap.no_king_beds * 2 + ap.no_extra_beds >= numOfBeds).ToList();
                }

                if (dateFrom != -1 && dateTo != -1)
                {
                    List <Models.apartment> tmp = entities.apartments.ToList();

                    foreach (Models.apartment ap in result)
                    {
                        if (ap.bookings.Count > 0)
                        {
                            Models.booking b = ap.bookings.FirstOrDefault(el => el.date_from >= dateFrom || el.date_to <= dateTo);
                            if (b == null)
                            {
                                tmp.Add(ap);
                            }
                        }
                        else
                        {
                            tmp.Add(ap);
                        }
                    }

                    result = tmp;
                }

                return(result.Select(el => ApartmentTypeConverter.ApartmentModelToObj(el)).ToList());
            }
            catch (Exception ex)
            {
                return(new List <Types.apartment>());
            }
        }
        public List <Types.apartment> AdvancedSearch(int dateFrom, int dateTo, int numOfKingBeds, int numOfSingleBeds, int numOfExtraBeds,
                                                     bool petFriendly, bool internet, bool airContitioning, bool tv, bool kitchen,
                                                     int stars, bool balcony, bool accessable)
        {
            Models.apartma2Entities entities = new Models.apartma2Entities();
            try
            {
                List <Models.apartment> result = entities.apartments.ToList();

                // filter by avilability
                if (dateFrom != -1 && dateTo != -1)
                {
                    List <Models.apartment> tmp = entities.apartments.ToList();

                    foreach (Models.apartment ap in result)
                    {
                        if (ap.bookings.Count > 0)
                        {
                            Models.booking b = ap.bookings.FirstOrDefault(el => el.date_from >= dateFrom || el.date_to <= dateTo);
                            if (b == null)
                            {
                                tmp.Add(ap);
                            }
                        }
                        else
                        {
                            tmp.Add(ap);
                        }
                    }

                    result = tmp;
                }

                if (numOfKingBeds != -1)
                {
                    result = result.Where(ap => ap.no_king_beds >= numOfKingBeds).ToList();
                }

                if (numOfSingleBeds != -1)
                {
                    result = result.Where(ap => ap.no_single_beds >= numOfSingleBeds).ToList();
                }

                if (numOfExtraBeds != -1)
                {
                    result = result.Where(ap => ap.no_extra_beds >= numOfExtraBeds).ToList();
                }

                if (petFriendly)
                {
                    result = result.Where(ap => ap.pet_friendly == true).ToList();
                }

                if (petFriendly)
                {
                    result = result.Where(ap => ap.pet_friendly == true).ToList();
                }

                if (internet)
                {
                    result = result.Where(ap => ap.internet == true).ToList();
                }

                if (airContitioning)
                {
                    result = result.Where(ap => ap.air_conditioning == true).ToList();
                }

                if (tv)
                {
                    result = result.Where(ap => ap.tv == true).ToList();
                }

                if (kitchen)
                {
                    result = result.Where(ap => ap.kitchen == true).ToList();
                }

                if (stars != -1)
                {
                    result = result.Where(ap => ap.class_stars >= stars).ToList();
                }

                if (balcony)
                {
                    result = result.Where(ap => ap.balcony == true).ToList();
                }

                if (accessable)
                {
                    result = result.Where(ap => ap.accessible == true).ToList();
                }

                return(result.Select(el => ApartmentTypeConverter.ApartmentModelToObj(el)).ToList());
            }
            catch (Exception ex)
            {
                return(new List <Types.apartment>());
            }
        }