Пример #1
0
        public IDictionary <int, string> GetTourRooms(int cityKeyFrom, int countryKey, List <int> cityToKeys, List <int> tourKeys, List <DateTime> tourDates, List <int> tourNights, List <int> hotelKeys, List <int> pansionKeys)
        {
            IDictionary <int, string> tourRooms;

            using (var mtsDc = new MtSearchDbDataContext())
            {
                using (var sftDc = new SftWebDbDataContext())
                {
                    tourRooms = mtsDc.GetTourRooms(sftDc, cityKeyFrom, countryKey, cityToKeys, tourKeys, tourDates, tourNights, hotelKeys, pansionKeys);
                }
            }
            return(tourRooms);
        }
Пример #2
0
        public IDictionary <int, string> GetCountriesTo()
        {
            IDictionary <int, string> countriesTo;

            using (var mtsDc = new MtSearchDbDataContext())
            {
                using (var sftDc = new SftWebDbDataContext())
                {
                    countriesTo = mtsDc.GetCountriesTo(sftDc);
                }
            }
            return(countriesTo);
        }
Пример #3
0
        public IDictionary <int, string> GetTourTypes(int cityKeyFrom, int countryKey)
        {
            IDictionary <int, string> tourTypes;

            using (var mtsDc = new MtSearchDbDataContext())
            {
                using (var sftDc = new SftWebDbDataContext())
                {
                    tourTypes = mtsDc.GetTourTypes(sftDc, cityKeyFrom, countryKey);
                }
            }
            return(tourTypes);
        }
Пример #4
0
        public IDictionary <int, string> GetCitiesTo(int cityKeyFrom, int countryKey, List <int> tourTypes)
        {
            IDictionary <int, string> citiesTo;

            using (var mtsDc = new MtSearchDbDataContext())
            {
                using (var sftDc = new SftWebDbDataContext())
                {
                    citiesTo = mtsDc.GetCitiesTo(sftDc, cityKeyFrom, countryKey, tourTypes);
                }
            }
            return(citiesTo);
        }
Пример #5
0
        public IEnumerable <int> GetTourNights(int cityKeyFrom, int countryKey, List <int> cityToKeys, List <int> tourKeys, List <DateTime> tourDates)
        {
            IEnumerable <int> tourNights;

            using (var mtsDc = new MtSearchDbDataContext())
            {
                using (var sftDc = new SftWebDbDataContext())
                {
                    tourNights = mtsDc.GetTourNights(sftDc, cityKeyFrom, countryKey, cityToKeys, tourKeys, tourDates);
                }
            }
            return(tourNights);
        }
Пример #6
0
        public IDictionary <int, string> GetCitiesFrom(int countryKey)
        {
            IDictionary <int, string> citiesFrom;

            using (var mtsDc = new MtSearchDbDataContext())
            {
                using (var sftDc = new SftWebDbDataContext())
                {
                    citiesFrom = mtsDc.GetCitiesDeparture(sftDc, countryKey);
                }
            }
            return(citiesFrom);
        }
Пример #7
0
        private void LoadHotels(MtSearchDbDataContext mtsDc, SftWebDbDataContext sftDc, bool isReinit = false)
        {
            if (RblCitiesFromFilter.Items.Count == 0 || DdlContriesToFilter.Items.Count == 0 ||
                ChblTourTypes.Items.Count == 0 || ChblCitiesToFilter.Items.Count == 0 ||
                DdlToursFilter.Items.Count == 0 || ArrivalDatesFilter.ArrivalDates == null ||
                !ArrivalDatesFilter.ArrivalDates.Any() ||
                ChblNightsFilter.Items.Count == 0 || ChblHotelCategoriesFilter.Items.Count == 0 ||
                ChblPansionsFilter.Items.Count == 0)
            {
                UcHotelsFilter.Items.Clear();
                return;
            }

            IList <string> selectedValues = new List <string>();

            if (isReinit && !UcHotelsFilter.IsAllOptionsSelected)
            {
                selectedValues = UcHotelsFilter.SelectedValues;
            }

            var hotels =
                mtsDc.GetTourHotels(sftDc, SelectedCityFromKey, SelectedCountryToKey, SelectedCitiesToKeys, SelectedTourKeys,
                                    SelectedArrivalDates,
                                    SelectedNights, SelectedHotelCategoriesKeys, SelectedPansionKeys,
                                    !UcHotelsFilter.IsFilterByArrNights).ToList();

            UcHotelsFilter.DataSource
                = hotels.ToDictionary(h => h.Key, h => GetHotelNameHtml(h.Name, h.Stars, h.ResortName, h.Url));
            UcHotelsFilter.DataBind();

            if (!UcHotelsFilter.IsFilterByArrNights)
            {
                foreach (var hotel in hotels.Where(h => !h.IsValidPrice))
                {
                    UcHotelsFilter.Items.FindByValue(hotel.Key.ToString(CultureInfo.InvariantCulture)).Enabled = false;
                }
            }

            if (isReinit && selectedValues.Any())
            {
                UcHotelsFilter.SelectItems(selectedValues);
            }
        }
Пример #8
0
        private bool InitFiltersByQs()
        {
            using (var mtmDc = new MtMainDbDataContext())
            {
                using (var mtsDc = new MtSearchDbDataContext())
                {
                    using (var sftDc = new SftWebDbDataContext())
                    {
                        foreach (KeyValuePair <Control, FilterDetails> filterDetail in _filterDetails)
                        {
                            filterDetail.Value.LoadDataAction(mtmDc, mtsDc, sftDc, false);
                            if (!filterDetail.Value.SelectValueByQsAction())
                            {
                                return(false);
                            }
                        }
                    }
                }
            }

            if (!SetAviaQuotesByQs())
            {
                return(false);
            }
            if (!SetRoomQuotesByQs())
            {
                return(false);
            }
            if (!SetMaxPriceByQs())
            {
                return(false);
            }
            if (!SetRowsNumberByQs())
            {
                return(false);
            }
            return(true);
        }
Пример #9
0
        private void LoadArrivalDates(MtSearchDbDataContext mtsDc, SftWebDbDataContext sftDc, bool isReinit = false)
        {
            if (mtsDc == null)
            {
                throw new ArgumentNullException("mtsDc");
            }

            if (RblCitiesFromFilter.Items.Count == 0 || DdlContriesToFilter.Items.Count == 0 ||
                ChblTourTypes.Items.Count == 0 || ChblCitiesToFilter.Items.Count == 0 ||
                DdlToursFilter.Items.Count == 0)
            {
                ArrivalDatesFilter.ClearArrivalDays();
                return;
            }

            DateTime?dateFrom = null;
            DateTime?dateTo   = null;

            if (isReinit && ArrivalDatesFilter.IsArrivalDateChangedByUser)
            {
                dateFrom = ArrivalDatesFilter.SelectedArrivalDateFrom;
                dateTo   = ArrivalDatesFilter.SelectedArrivalDateTo;
            }

            // если это первая загрузка страницы подтягиваем инициализацию фильтра из Web.config
            if (!Page.IsPostBack)
            {
                ArrivalDatesFilter.MaxArrivalRange     = Globals.Settings.TourFilters.MaxArrivalRange;
                ArrivalDatesFilter.DefaultArrivalRange = Globals.Settings.TourFilters.DefaultArrivalRange;
            }

            ArrivalDatesFilter.LoadArrivalDates(mtsDc.GetTourDates(sftDc, SelectedCityFromKey, SelectedCountryToKey, SelectedCitiesToKeys, SelectedTourKeys));

            if (isReinit && ArrivalDatesFilter.IsArrivalDateChangedByUser && dateFrom.HasValue && dateTo.HasValue && ArrivalDatesFilter.ArrivalDates.Contains(dateFrom.Value) && ArrivalDatesFilter.ArrivalDates.Contains(dateTo.Value))
            {
                ArrivalDatesFilter.SelectArrivalRange(dateFrom.Value, dateTo.Value);
            }
        }
Пример #10
0
        // ReSharper disable RedundantNameQualifier
        public IEnumerable <Seemplexity.Services.Wcf.ToursSearch.DataModel.Hotel> GetTourHotels(int cityKeyFrom, int countryKey, List <int> cityToKeys, List <int> tourKeys, List <DateTime> tourDates,
                                                                                                List <int> tourNights, List <string> hotelCats, List <int> pansionKeys)
        // ReSharper restore RedundantNameQualifier
        {
            // ReSharper disable RedundantNameQualifier
            IEnumerable <Seemplexity.Services.Wcf.ToursSearch.DataModel.Hotel> tourHotels;

            // ReSharper restore RedundantNameQualifier
            using (var mtsDc = new MtSearchDbDataContext())
            {
                using (var sftDc = new SftWebDbDataContext())
                {
                    tourHotels =
                        // ReSharper disable RedundantNameQualifier
                        Seemplexity.Services.Wcf.ToursSearch.DataModel.Hotel.GetHotelsList(
                            // ReSharper restore RedundantNameQualifier
                            mtsDc.GetTourHotels(sftDc, cityKeyFrom, countryKey, cityToKeys, tourKeys, tourDates,
                                                // ReSharper disable once RedundantArgumentDefaultValue
                                                tourNights, hotelCats, pansionKeys, false).ToList());
                }
            }
            return(tourHotels);
        }
Пример #11
0
        private void InitFilters(Control startFromFilter = null, bool isReinit = false, bool skipFirstFilter = true)
        {
            var finded = startFromFilter == null;

            using (var mtmDc = new MtMainDbDataContext())
            {
                using (var mtsDc = new MtSearchDbDataContext())
                {
                    using (var sftDc = new SftWebDbDataContext())
                    {
                        foreach (KeyValuePair <Control, FilterDetails> filterDetail in _filterDetails)
                        {
                            if (!skipFirstFilter)
                            {
                                finded = startFromFilter == filterDetail.Key;
                            }

                            if (finded)
                            {
                                filterDetail.Value.LoadDataAction(mtmDc, mtsDc, sftDc, isReinit);
                            }
                            else
                            {
                                finded = startFromFilter == filterDetail.Key;
                            }
                        }
                    }
                }
            }

            //todo: добавить инициализацию фильтров значениями по умолчанию из web.config
            // для тех фильтров которые не загружаются из БД
            if (startFromFilter == null) // для тех фильтров значение которых не меняются при изменении других фильтров
            {
                DdlRowsNumber.SelectedValue = DdlRowsNumber.Items.FindByValue(Globals.Settings.TourFilters.DefaultToursNumberOnPage.ToString(CultureInfo.InvariantCulture)).Value;
            }
        }
Пример #12
0
        private static void MakeActualizeTourResponse(HttpContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            var queryString = context.Request.QueryString;

            long offerId;
            int  currencyId;

            try
            {
                offerId    = long.Parse(queryString["offerId"]);
                currencyId = int.Parse(queryString["currencyId"]);
            }
            catch (Exception)
            {
                context.Response.Write("<error>Incorrect parametr.</error>");
                return;
            }

            using (var mtmDc = new MtMainDbDataContext())
            {
                using (var mtsDc = new MtSearchDbDataContext())
                {
                    using (var sftDc = new SftWebDbDataContext())
                    {
                        string hash;
                        var    elementsList = mtsDc.ActualizeTour(mtmDc, sftDc, offerId, currencyId, out hash) as IXmlCompatible;
                        SaveXmlToResponse(context, "actualizeTourResult", elementsList, hash);
                    }
                }
            }
        }
Пример #13
0
        private static void MakeResponse <T>(HttpContext context, string resaultName, Func <MtMainDbDataContext, MtSearchDbDataContext, SftWebDbDataContext, int?, Tuple <List <T>, string> > getElementsFunc)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            if (getElementsFunc == null)
            {
                throw new ArgumentNullException("getElementsFunc");
            }
            if (resaultName == null || String.IsNullOrWhiteSpace(resaultName))
            {
                throw new ArgumentNullException("resaultName");
            }

            var queryString = context.Request.QueryString;

            int?id = QDSearch.Helpers.Converters.GetIntSafe(queryString["id"]);

            if (queryString.AllKeys.Contains("id") && !id.HasValue)
            {
                context.Response.Write("<error>Incorrect parametr.</error>");
                return;
            }
            using (var mtmDc = new MtMainDbDataContext())
            {
                using (var mtsDc = new MtSearchDbDataContext())
                {
                    using (var sftDc = new SftWebDbDataContext())
                    {
                        Tuple <List <T>, string> tuple = getElementsFunc(mtmDc, mtsDc, sftDc, id);
                        SaveXmlToResponse(context, resaultName, tuple.Item1.ConvertAll(c => c as IXmlCompatible), tuple.Item2);
                    }
                }
            }
        }
Пример #14
0
        private void LoadCitiesFrom(MtSearchDbDataContext mtsDc, SftWebDbDataContext sftDc, bool isReinit = false)
        {
            if (mtsDc == null)
            {
                throw new ArgumentNullException("mtsDc");
            }

            if (DdlContriesToFilter.Items.Count == 0)
            {
                RblCitiesFromFilter.Items.Clear();
                return;
            }

            // Код ниже реализует следующей алгоритм. При смене страны если пользователь ранее менял город вылета, выбирается ранее выбранный город вылета,
            // если такой город отсуствует в списке, пробуем выбрать город вылета из Web.config, если и этот город отсустствует в списке выбираем первый город из списка.
            // Если при смене города пользователь ранее не менял город вылета, то проем выбрать город вылета из Web.config, если не получилось то пробуем выбрать первый город из списака.


            // если это изменение фильтров пользователем и пользователь менял город вылета,
            // то запоминаем выбор пользователя, чтобы потом его повторить
            ListItem selectedItem = null;

            if (isReinit && IsCityFromChangedByUser)
            {
                selectedItem = RblCitiesFromFilter.SelectedItem;
            }

            //грузим города вылета
            RblCitiesFromFilter.DataSource = mtsDc.GetCitiesDeparture(sftDc, SelectedCountryToKey).ToDictionary(k => k.Key, v => HttpUtility.HtmlEncode(v.Value));
            RblCitiesFromFilter.DataBind();

            // если это изменение фильтров пользователем и пользователь менял город вылета,
            // то пытаемся восстановить выбор пользователя
            if (isReinit && IsCityFromChangedByUser && selectedItem != null && RblCitiesFromFilter.Items.FindByValue(selectedItem.Value) != null)
            {
                RblCitiesFromFilter.SelectedValue = selectedItem.Value;
            }

            // если пользователь не менял город вылета, то пробуем выбрать город вылета по значению в Web.config
            if (!IsCityFromChangedByUser &&
                RblCitiesFromFilter.Items.FindByValue(
                    Globals.Settings.TourFilters.DefaultCityFromKey.ToString(CultureInfo.InvariantCulture)) != null)
            {
                RblCitiesFromFilter.SelectedValue =
                    Globals.Settings.TourFilters.DefaultCityFromKey.ToString(CultureInfo.InvariantCulture);
            }

            // если город вылета так и не выбран, но при этом список городов вылета содержит элементы,
            // пробуем еще раз выбрать город вылета из Web.config в случае не удачи, выбираем первый город вылета в списке.
            if (RblCitiesFromFilter.SelectedItem == null && RblCitiesFromFilter.Items.Count > 0)
            {
                if (RblCitiesFromFilter.Items.FindByValue(
                        Globals.Settings.TourFilters.DefaultCityFromKey.ToString(CultureInfo.InvariantCulture)) != null)
                {
                    RblCitiesFromFilter.SelectedValue =
                        Globals.Settings.TourFilters.DefaultCityFromKey.ToString(CultureInfo.InvariantCulture);
                }
                else
                {
                    RblCitiesFromFilter.SelectedIndex = 0;
                }
            }
        }
Пример #15
0
        private void LoadRoomTypesAndMens(MtMainDbDataContext mtmDc, MtSearchDbDataContext mtsDc, SftWebDbDataContext sftDc, bool isReinit)
        {
            if (RblCitiesFromFilter.Items.Count == 0 || DdlContriesToFilter.Items.Count == 0 ||
                ChblTourTypes.Items.Count == 0 || ChblCitiesToFilter.Items.Count == 0 ||
                DdlToursFilter.Items.Count == 0 || ArrivalDatesFilter.ArrivalDates == null ||
                !ArrivalDatesFilter.ArrivalDates.Any() ||
                ChblNightsFilter.Items.Count == 0 || ChblHotelCategoriesFilter.Items.Count == 0 ||
                UcHotelsFilter.Items.Count == 0 || ChblPansionsFilter.Items.Count == 0)
            {
                DdlRoomTypesFilter.Items.Clear();
                return;
            }


            // выбираем вариант поиска по номеру или по людям в зависимости от большинства туров с ценой за номер или за человека
            PnPersons.Visible = !(PnRoomTypes.Visible = mtsDc.IsCountryPriceForMen(SelectedCountryToKey));

            if (PnRoomTypes.Visible)
            {
                DdlRoomTypesFilter.DataSource = AddFirstCustomElement(-1, "- все -",
                                                                      mtsDc.GetTourRooms(sftDc, SelectedCityFromKey, SelectedCountryToKey, SelectedCitiesToKeys, SelectedTourKeys, SelectedArrivalDates, SelectedNights,
                                                                                         SelectedHotelKeys, SelectedPansionKeys).ToDictionary(k => k.Key, v => HttpUtility.HtmlEncode(v.Value)));
                DdlRoomTypesFilter.DataBind();
            }
            else
            {
                DdlRoomTypesFilter.Items.Clear();
            }
        }
Пример #16
0
        private static void MakeToursXmlResponse(HttpContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            var queryString = context.Request.QueryString;

            var offerId = QDSearch.Helpers.Converters.GetLongSafe(queryString["offerId"]);
            int currencyId;

            if (queryString.AllKeys.Contains("offerId") && !offerId.HasValue)
            {
                context.Response.Write("<error>Incorrect parametr.</error>");
                return;
            }

            try
            {
                currencyId = int.Parse(queryString["currencyId"]);
            }
            catch (Exception)
            {
                context.Response.Write("<error>Incorrect parametr.</error>");
                return;
            }

            if (offerId.HasValue)
            {
                using (var mtmDc = new MtMainDbDataContext())
                {
                    using (var mtsDc = new MtSearchDbDataContext())
                    {
                        using (var sftDc = new SftWebDbDataContext())
                        {
                            string hash;
                            var    elementsList = mtsDc.GetTours(mtmDc, sftDc, offerId.Value, currencyId, out hash).Item2.ConvertAll(c => c as IXmlCompatible);
                            SaveXmlToResponse(context, @"getToursResult", elementsList, hash);
                        }
                    }
                }
                return;
            }

            int           count;
            int           countryId;
            int           departCityId;
            DateTime      dateFrom;
            DateTime      dateTo;
            ushort        adults;
            ushort        kids;
            List <ushort> kidsAges;
            int           nightsMin;
            int           nightsMax;
            List <int>    resorts;
            List <int>    hotelCategories;
            List <int>    hotels;
            List <int>    meals;
            uint?         priceMin;
            uint?         priceMax;
            int?          hotelIsNotInStop;
            int?          ticketsIncluded;
            int?          hasTickets;

            try
            {
                count        = int.Parse(queryString["count"]);
                countryId    = int.Parse(queryString["countryId"]);
                departCityId = int.Parse(queryString["departCityId"]);
                dateFrom     = DateTime.ParseExact(queryString["dateFrom"], "dd.MM.yyyy", new CultureInfo("ru-RU"));
                dateTo       = DateTime.ParseExact(queryString["dateTo"], "dd.MM.yyyy", new CultureInfo("ru-RU"));
                adults       = ushort.Parse(queryString["adults"]);
                kids         = ushort.Parse(queryString["kids"]);
                kidsAges     = kids > 0
                    ? queryString["kidsAges"].Split(',').Select(ushort.Parse).ToList()
                    : null;
                nightsMin = int.Parse(queryString["nightsMin"]);
                nightsMax = int.Parse(queryString["nightsMax"]);
                resorts   = queryString.AllKeys.Contains("resorts")
                    ? queryString["resorts"].Split(',').Select(int.Parse).ToList()
                    : null;
                hotelCategories = queryString.AllKeys.Contains("hotelCategories")
                    ? queryString["hotelCategories"].Split(',').Select(int.Parse).ToList()
                    : null;
                hotels = queryString.AllKeys.Contains("hotels")
                    ? queryString["hotels"].Split(',').Select(int.Parse).ToList()
                    : null;
                meals = queryString.AllKeys.Contains("meals")
                    ? queryString["meals"].Split(',').Select(int.Parse).ToList()
                    : null;
                currencyId = int.Parse(queryString["currencyId"]);
                priceMin   = queryString.AllKeys.Contains("priceMin")
                    ? uint.Parse(queryString["priceMin"])
                    : (uint?)null;
                priceMax = queryString.AllKeys.Contains("priceMax")
                    ? uint.Parse(queryString["priceMax"])
                    : (uint?)null;
                hotelIsNotInStop = queryString.AllKeys.Contains("hotelIsNotInStop")
                    ? int.Parse(queryString["hotelIsNotInStop"])
                    : (int?)null;
                ticketsIncluded = queryString.AllKeys.Contains("ticketsIncluded")
                    ? int.Parse(queryString["ticketsIncluded"])
                    : (int?)null;
                hasTickets = queryString.AllKeys.Contains("hasTickets")
                    ? int.Parse(queryString["hasTickets"])
                    : (int?)null;
            }
            catch (Exception)
            {
                context.Response.Write("<error>Incorrect parametr.</error>");
                return;
            }
            using (var mtmDc = new MtMainDbDataContext())
            {
                using (var mtsDc = new MtSearchDbDataContext())
                {
                    using (var sftDc = new SftWebDbDataContext())
                    {
                        string hash;
                        var    elementsList = mtsDc.GetTours(mtmDc, sftDc, count, countryId, departCityId, dateFrom, dateTo, adults, kids, kidsAges, nightsMin, nightsMax, resorts, hotelCategories, hotels, meals, currencyId, priceMin, priceMax, hotelIsNotInStop, ticketsIncluded, hasTickets, out hash).Item2.ConvertAll(c => c as IXmlCompatible);
                        SaveXmlToResponse(context, "getToursResult", elementsList, hash);
                    }
                }
            }
        }
Пример #17
0
        /// <summary>
        /// Города вылета
        /// </summary>
        /// <param name="sftDc"></param>
        /// <param name="cityKey">Ключ города (оциональный)</param>
        /// <param name="searchDc"></param>
        /// <param name="hash"></param>
        /// <returns></returns>
        public static List <City> GetDepartCities(this MtSearchDbDataContext searchDc, SftWebDbDataContext sftDc, int?cityKey, out string hash)
        {
            List <City> result;

            hash = String.Format("{0}_{1}", MethodBase.GetCurrentMethod().Name, cityKey);
            if ((result = CacheHelper.GetCacheItem <List <City> >(hash)) != null)
            {
                return(result);
            }

            var    cacheDependencies = new List <string>();
            string hashOut;
            var    cities = searchDc.GetCitiesDeparture(sftDc, null, out hashOut);

            cacheDependencies.Add(hashOut);

            result = new List <City>(cities.Count);
            if (cityKey == null)
            {
                result.AddRange(cities.Select(city => new City
                {
                    Id          = city.Key,
                    Name        = city.Value.Trim(),
                    CountriesTo = searchDc.GetCountriesTo(sftDc, city.Key, out hashOut).Select(c => new CountryTo {
                        Id = c.Key
                    }).ToList()
                }));
            }
            else
            {
                result.AddRange(cities.Where(c => c.Key == cityKey.Value).Select(city => new City
                {
                    Id          = city.Key,
                    Name        = city.Value.Trim(),
                    CountriesTo = searchDc.GetCountriesTo(sftDc, city.Key, out hashOut).Select(c => new CountryTo {
                        Id = c.Key
                    }).ToList()
                }));
            }

            cacheDependencies.Add(hashOut);
            cacheDependencies.Add(CountriesExtension.TableName);
            cacheDependencies.Add(CitiesExtension.TableName);

            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Пример #18
0
        public static Tuple <SearchResult, List <Tour> > GetTours(this MtSearchDbDataContext searchDc, MtMainDbDataContext mainDc, SftWebDbDataContext sftDc, long offerId, int currencyId, out string hash)
        {
            Tuple <SearchResult, List <Tour> > result;

            hash = String.Format("{0}_{1}_{2}", MethodBase.GetCurrentMethod().Name, offerId, currencyId);

            if ((result = CacheHelper.GetCacheItem <Tuple <SearchResult, List <Tour> > >(hash)) != null)
            {
                return(result);
            }

            string hashOut;
            var    cacheDependencies = new List <string>();
            var    searchResult      = searchDc.GetSearchResult(mainDc, sftDc, offerId, currencyId, out hashOut);

            cacheDependencies.Add(hashOut);
            var tours = searchDc.ConvertSearchItemsToTours(mainDc, searchResult.SearchItems, currencyId);

            result = new Tuple <SearchResult, List <Tour> >(searchResult, tours);

            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Пример #19
0
        public static Tuple <SearchResult, List <Tour> > GetTours(this MtSearchDbDataContext searchDc, MtMainDbDataContext mainDc, SftWebDbDataContext sftDc,
                                                                  int count, int countryId, int departCityId, DateTime dateFrom, DateTime dateTo, ushort adults, ushort kids, IEnumerable <ushort> kidsAges,
                                                                  int nightsMin, int nightsMax, IEnumerable <int> resorts, IEnumerable <int> hotelCategories, IEnumerable <int> hotels, IEnumerable <int> meals,
                                                                  int currencyId, uint?priceMin, uint?priceMax, int?hotelsIsNotInStop, int?ticketsIncluded, int?hasTickets, out string hash)
        {
            Tuple <SearchResult, List <Tour> > result;

            hash = String.Format("{0}_{1}", MethodBase.GetCurrentMethod().Name,
                                 CacheHelper.GetCacheKeyHashed(new[]
            {
                count.ToString(),
                countryId.ToString(),
                departCityId.ToString(),
                dateFrom.ToString(),
                dateTo.ToString(),
                adults.ToString(),
                kids.ToString(),
                kidsAges != null ? String.Join("_", kidsAges) : String.Empty,
                nightsMin.ToString(),
                nightsMax.ToString(),
                resorts != null ? String.Join("_", resorts) : String.Empty,
                hotelCategories != null ? String.Join("_", hotelCategories) : String.Empty,
                hotels != null ? String.Join("_", hotels) : String.Empty,
                meals != null ? String.Join("_", meals) : String.Empty,
                currencyId.ToString(),
                priceMin.ToString(),
                priceMax.ToString(),
                hotelsIsNotInStop.ToString(),
                ticketsIncluded.ToString(),
                hasTickets.ToString()
            }));
            if ((result = CacheHelper.GetCacheItem <Tuple <SearchResult, List <Tour> > >(hash)) != null)
            {
                return(result);
            }

            string hashOut;
            var    cacheDependencies = new List <string>();
            var    searchResult      = searchDc.GetSearchResult(mainDc, sftDc, null, count, countryId, departCityId, dateFrom,
                                                                dateTo, adults, kids, kidsAges, nightsMin, nightsMax, resorts, hotelCategories, hotels, meals,
                                                                currencyId, priceMin, priceMax, hotelsIsNotInStop, ticketsIncluded, hasTickets, out hashOut);

            cacheDependencies.Add(hashOut);
            var tours = searchDc.ConvertSearchItemsToTours(mainDc, searchResult.SearchItems, currencyId);

            result = new Tuple <SearchResult, List <Tour> >(searchResult, tours);

            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Пример #20
0
        /// <summary>
        /// Отели
        /// </summary>
        /// <param name="searchDc"></param>
        /// <param name="sftDc"></param>
        /// <param name="hotelKey">Ключ категории</param>
        /// <param name="mainDc"></param>
        /// <param name="hash"></param>
        /// <returns></returns>
        public static List <DataModel.Hotel> GetHotels(this MtMainDbDataContext mainDc, MtSearchDbDataContext searchDc, SftWebDbDataContext sftDc, int?hotelKey, out string hash)
        {
            List <DataModel.Hotel> result;

            hash = String.Format("{0}_{1}", MethodBase.GetCurrentMethod().Name, hotelKey);
            if ((result = CacheHelper.GetCacheItem <List <DataModel.Hotel> >(hash)) != null)
            {
                return(result);
            }

            result = new List <DataModel.Hotel>();
            var cacheDependencies = new List <string>();

            if (hotelKey == null)
            {
                string hashOut;
                var    hotelCities = (from r in searchDc.GetResorts(sftDc, null, out hashOut)
                                      select r.Id)
                                     .ToList();
                cacheDependencies.Add(hashOut);

                var hotels = (from h in searchDc.GetAllHotels()
                              join c in mainDc.GetAllHotelCats() on h.Stars equals c.COH_Name
                              where hotelCities.Contains(h.CtKey)
                              select
                              new DataModel.Hotel {
                    Id = h.Key, Name = h.Name, ResortId = h.CtKey, HotelCategoryId = c.COH_Id
                })
                             .ToList();

                result.AddRange(hotels);
            }
            else
            {
                string hashOut;
                var    hotel = searchDc.GetHotelByKey(hotelKey.Value, out hashOut);
                cacheDependencies.Add(hashOut);

                if (hotel != null)
                {
                    var cat = mainDc.GetAllHotelCats().SingleOrDefault(c => c.COH_Name == hotel.Stars);
                    if (cat != null)
                    {
                        result.Add(new DataModel.Hotel
                        {
                            HotelCategoryId = cat.COH_Id,
                            Id       = hotel.Key,
                            Name     = hotel.Name,
                            ResortId = hotel.CtKey
                        });
                    }
                }
            }

            cacheDependencies.Add(HotelsExtension.TableName);
            cacheDependencies.Add(HotelCategoriesExtension.TableName);
            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Пример #21
0
        private static SearchResult GetSearchResult(this MtSearchDbDataContext searchDc, MtMainDbDataContext mainDc, SftWebDbDataContext sftDc, long?offerId, int currencyId, out string hash)
        {
            SearchResult result;

            hash = String.Format("{0}_{1}_{2}", MethodBase.GetCurrentMethod().Name, offerId, currencyId);
            if ((result = CacheHelper.GetCacheItem <SearchResult>(hash)) != null)
            {
                return(result);
            }

            var    cacheDependencies = new List <string>();
            string hashOut;

            result = searchDc.GetSearchResult(mainDc, sftDc, offerId, 0, 0, 0, DateTime.Now, DateTime.Now, 0, 0, null, 0, 0, null,
                                              null, null, null, currencyId, null, null, null, null, null, out hashOut);
            cacheDependencies.Add(hashOut);

            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Пример #22
0
        private static SearchResult GetSearchResult(this MtSearchDbDataContext searchDc, MtMainDbDataContext mainDc, SftWebDbDataContext sftDc, long?offerId, int count, int countryId, int departCityId, DateTime dateFrom, DateTime dateTo, ushort adults, ushort kids, IEnumerable <ushort> kidsAges, int nightsMin, int nightsMax, IEnumerable <int> resorts, IEnumerable <int> hotelCategories, IEnumerable <int> hotels, IEnumerable <int> meals, int currencyId, uint?priceMin, uint?priceMax, int?hotelsIsNotInStop, int?ticketsIncluded, int?hasTickets, out string hash)
        {
            SearchResult result;

            hash = String.Format("{0}_{1}", MethodBase.GetCurrentMethod().Name,
                                 CacheHelper.GetCacheKeyHashed(new[]
            {
                offerId.ToString(),
                count.ToString(CultureInfo.InvariantCulture),
                countryId.ToString(CultureInfo.InvariantCulture),
                departCityId.ToString(CultureInfo.InvariantCulture),
                dateFrom.ToString(CultureInfo.InvariantCulture),
                dateTo.ToString(CultureInfo.InvariantCulture),
                adults.ToString(CultureInfo.InvariantCulture),
                kids.ToString(CultureInfo.InvariantCulture),
                kidsAges != null ? String.Join("_", kidsAges) : String.Empty,
                nightsMin.ToString(CultureInfo.InvariantCulture),
                nightsMax.ToString(CultureInfo.InvariantCulture),
                resorts != null ? String.Join("_", resorts) : String.Empty,
                hotelCategories != null ? String.Join("_", hotelCategories) : String.Empty,
                hotels != null ? String.Join("_", hotels) : String.Empty,
                meals != null ? String.Join("_", meals) : String.Empty,
                currencyId.ToString(CultureInfo.InvariantCulture),
                priceMin.ToString(),
                priceMax.ToString(),
                hotelsIsNotInStop.ToString(),
                ticketsIncluded.ToString(),
                hasTickets.ToString()
            }));
            if ((result = CacheHelper.GetCacheItem <SearchResult>(hash)) != null)
            {
                return(result);
            }


            result = new SearchResult();
            var    cacheDependencies = new List <string>();
            string hashOut;
            var    wrongQuery = false;

            if (offerId == null)
            {
                var tourTypes = searchDc.GetTourTypes(sftDc, departCityId, countryId, out hashOut).Keys.ToList();
                cacheDependencies.Add(hashOut);
                if (tourTypes == null || !tourTypes.Any())
                {
                    wrongQuery = true;
                    CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
                    return(result);
                }

                if (resorts == null || !resorts.Any())
                {
                    resorts = searchDc.GetCitiesTo(sftDc, departCityId, countryId, tourTypes, out hashOut).Keys.ToList();
                    cacheDependencies.Add(hashOut);
                }
                if (resorts == null || !resorts.Any())
                {
                    wrongQuery = true;
                    CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
                    return(result);
                }

                IList <int> tourKeys =
                    searchDc.GetTours(sftDc, departCityId, countryId, tourTypes, resorts, out hashOut).Keys.ToList();
                cacheDependencies.Add(hashOut);
                if (tourKeys == null || !tourKeys.Any())
                {
                    wrongQuery = true;
                    CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
                    return(result);
                }

                IList <DateTime> tourDates =
                    searchDc.GetTourDates(sftDc, departCityId, countryId, resorts, tourKeys, out hashOut)
                    .Where(d => d >= dateFrom && d <= dateTo)
                    .ToList();
                cacheDependencies.Add(hashOut);
                if (tourDates == null || !tourDates.Any())
                {
                    wrongQuery = true;
                    CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
                    return(result);
                }

                IList <int> tourNights =
                    searchDc.GetTourNights(sftDc, departCityId, countryId, resorts, tourKeys, tourDates, out hashOut)
                    .Where(n => n >= nightsMin && n <= nightsMax)
                    .ToList();
                cacheDependencies.Add(hashOut);
                if (tourNights == null || !tourNights.Any())
                {
                    wrongQuery = true;
                    CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
                    return(result);
                }

                IList <string> hotelStars;
                if (hotelCategories == null || !hotelCategories.Any())
                {
                    hotelStars =
                        searchDc.GetTourHotelClasses(sftDc, departCityId, countryId, resorts, tourKeys, tourDates,
                                                     tourNights, out hashOut).ToList();
                    cacheDependencies.Add(hashOut);
                }
                else
                {
                    hotelStars = mainDc.GetAllHotelCats()
                                 .Where(c => hotelCategories.Contains(c.COH_Id))
                                 .Select(c => c.COH_Name)
                                 .ToList();
                    cacheDependencies.Add(HotelCategoriesExtension.TableName);
                }
                if (hotelStars == null || !hotelStars.Any())
                {
                    wrongQuery = true;
                    CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
                    return(result);
                }

                if (meals == null || !meals.Any())
                {
                    meals =
                        searchDc.GetTourPansions(sftDc, departCityId, countryId, resorts, tourKeys, tourDates,
                                                 tourNights,
                                                 hotelStars, out hashOut).Keys.ToList();
                    cacheDependencies.Add(hashOut);
                }
                if (meals == null || !meals.Any())
                {
                    wrongQuery = true;
                    CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
                    return(result);
                }

                if (hotels == null || !hotels.Any())
                {
                    hotels =
                        searchDc.GetTourHotels(sftDc, departCityId, countryId, resorts, tourKeys, tourDates,
                                               tourNights, hotelStars, meals, out hashOut)
                        .Select(h => h.Key)
                        .ToList();
                    cacheDependencies.Add(hashOut);
                }
                if (hotels == null || !hotels.Any())
                {
                    wrongQuery = true;
                    CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
                    return(result);
                }

                IEnumerable <int> roomKeys = null;
                // если по стране цена за человека, меняем алгоритм
                if (searchDc.IsCountryPriceForMen(countryId))
                {
                    var rooms = searchDc.GetTourRooms(sftDc, departCityId, countryId, resorts, tourKeys,
                                                      tourDates, tourNights, hotels, meals);
                    roomKeys = (from r in searchDc.GetAllRooms()
                                where rooms.Keys.Contains(r.RM_KEY) &&
                                r.RM_NPLACES == adults
                                select r.RM_KEY)
                               .ToList();
                }

                ushort?firstChildYears = null, secondChildYears = null;
                if (kidsAges != null)
                {
                    if (kidsAges.Any())
                    {
                        firstChildYears = kidsAges.ElementAtOrDefault(0);
                    }
                    if (kidsAges.Count() > 1)
                    {
                        secondChildYears = kidsAges.ElementAtOrDefault(1);
                    }
                }
                var hotelQuotaMask = QuotesStates.Request | QuotesStates.No | QuotesStates.Availiable;
                if (hotelsIsNotInStop != null && hotelsIsNotInStop == 1)
                {
                    hotelQuotaMask = hotelQuotaMask - (byte)QuotesStates.No;
                }

                var aviaQuotaMask = QuotesStates.None | QuotesStates.Request | QuotesStates.No | QuotesStates.Availiable;
                if (ticketsIncluded != null && ticketsIncluded == 1)
                {
                    aviaQuotaMask = aviaQuotaMask - (byte)QuotesStates.None;
                }

                if (hasTickets != null && hasTickets == 1)
                {
                    aviaQuotaMask = aviaQuotaMask - (byte)QuotesStates.No - (byte)QuotesStates.Request;
                }

                result = searchDc.PagingOnClient(mainDc, departCityId, countryId, tourKeys, tourDates, tourNights,
                                                 hotels, meals,
                                                 adults, kids, firstChildYears, secondChildYears, roomKeys, hotelQuotaMask, aviaQuotaMask,
                                                 currencyId, priceMin, priceMax, (ushort)count, 0,
                                                 new Tuple <SortingColumn, SortingDirection>(SortingColumn.Price, SortingDirection.Asc), out hashOut);
                cacheDependencies.Add(hashOut);
            }
            else
            {
                var countryCityKeys = mainDc.GetCountryCityKeysByTourKey((int)offerId.Value, out hashOut);
                cacheDependencies.Add(hashOut);

                result = searchDc.PagingOnClient(mainDc, countryCityKeys.Item2, countryCityKeys.Item1, offerId.Value, out hashOut);
                cacheDependencies.Add(hashOut);
            }

            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Пример #23
0
        /// <summary>
        /// Курорты
        /// </summary>
        /// <param name="sftDc"></param>
        /// <param name="resortKey">Ключ курорта</param>
        /// <param name="searchDc"></param>
        /// <param name="hash"></param>
        /// <returns></returns>
        public static List <DataModel.Resort> GetResorts(this MtSearchDbDataContext searchDc, SftWebDbDataContext sftDc, int?resortKey, out string hash)
        {
            List <DataModel.Resort> result;

            hash = String.Format("{0}_{1}", MethodBase.GetCurrentMethod().Name, resortKey);
            if ((result = CacheHelper.GetCacheItem <List <DataModel.Resort> >(hash)) != null)
            {
                return(result);
            }

            var cacheDependencies = new List <string>();

            result = new List <DataModel.Resort>();
            if (resortKey == null)
            {
                string hashOut;
                var    cities = searchDc.GetCitiesDeparture(sftDc, null, out hashOut);
                cacheDependencies.Add(hashOut);

                foreach (var city in cities)
                {
                    var countries = searchDc.GetCountriesTo(sftDc, city.Key, out hashOut);
                    if (!cacheDependencies.Contains(hashOut))
                    {
                        cacheDependencies.Add(hashOut);
                    }

                    foreach (var country in countries)
                    {
                        var resorts = searchDc.GetCitiesTo(sftDc, city.Key, country.Key, null, out hashOut);
                        if (!cacheDependencies.Contains(hashOut))
                        {
                            cacheDependencies.Add(hashOut);
                        }

                        result.AddRange(resorts.Select(r => new DataModel.Resort
                        {
                            CountryId = country.Key,
                            Id        = r.Key,
                            Name      = r.Value
                        }).ToList());
                    }
                }
            }
            else
            {
                var resort = searchDc.GetCityByKey(resortKey.Value);
                result.Add(new DataModel.Resort
                {
                    Id        = resort.CT_KEY,
                    Name      = resort.CT_NAME,
                    CountryId = resort.CT_CNKEY
                });
            }


            cacheDependencies.Add(CountriesExtension.TableName);
            cacheDependencies.Add(CitiesExtension.TableName);

            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Пример #24
0
        public static ActualizedTour ActualizeTour(this MtSearchDbDataContext searchDc, MtMainDbDataContext mainDc, SftWebDbDataContext sftDc, long offerId, int currencyId, out string hash)
        {
            ActualizedTour result;

            hash = String.Format("{0}_{1}_{2}", MethodBase.GetCurrentMethod().Name, offerId, currencyId);
            if ((result = CacheHelper.GetCacheItem <ActualizedTour>(hash)) != null)
            {
                return(result);
            }

            string hashOut;
            var    searchResult = searchDc.GetSearchResult(mainDc, sftDc, offerId, currencyId, out hashOut);
            var    tour         = searchDc.ConvertSearchItemsToTours(mainDc, searchResult.SearchItems, currencyId);

            if (tour.Count == 0)
            {
                throw new ApplicationException(MethodBase.GetCurrentMethod().Name +
                                               ". Данных по цене в БД не найдено. Параметры: " + String.Format("{0}_{1}", offerId, currencyId));
            }

            string rateCode = searchDc.GetRateCodeByKey(currencyId);

            var cacheDependencies = new List <string> {
                hashOut
            };

            result = new ActualizedTour
            {
                FewBusinessTicketsDpt = tour[0].FewTicketsDptB,
                FewBusinessTicketsRtn = tour[0].FewTicketsRtnB,
                FewEconomTicketsDpt   = tour[0].FewTicketsDptY,
                FewEconomTicketsRtn   = tour[0].FewTicketsRtnY,
                FewPlacesInHotel      = tour[0].FewPlacesInHotel,
                TicketsIsIncluded     = tour[0].TicketsIncluded,
                HasBusinessTicketsDpt = tour[0].HasBusinessTicketsDpt,
                HasBusinessTicketsRtn = tour[0].HasBusinessTicketsRtn,
                HasEconomTicketsDpt   = tour[0].HasEconomTicketsDpt,
                HasEconomTicketsRtn   = tour[0].HasEconomTicketsRtn,
                TourUrl = tour[0].TourUrl,
                Price   = tour[0].Price
            };

            var parameters     = new List <MtServiceParams>();
            var commandBuilder = new StringBuilder();

            commandBuilder.AppendLine("select distinct ts_key, ts_svkey, ts_name, ts_day, ts_days, ts_attribute, ts_code, ts_subcode1, ts_subcode2, ts_ctkey, ts_men, ts_oppacketkey, ts_oppartnerkey ");
            commandBuilder.AppendLine("from tp_services ");
            commandBuilder.AppendLine(String.Format("where ts_Key in (select tl_tskey from tp_servicelists where tl_tikey in (select tp_tikey from tp_prices where tp_key = {0})) ", tour[0].OfferId));
            commandBuilder.AppendLine("order by ts_day asc ");

            using (var command = mainDc.Connection.CreateCommand())
            {
                command.CommandText = commandBuilder.ToString();

                mainDc.Connection.Open();
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var pars = new MtServiceParams()
                        {
                            Code      = reader.GetInt32("ts_code"),
                            CtKey     = reader.GetInt32("ts_ctkey"),
                            Day       = reader.GetInt16("ts_day"),
                            Days      = reader.GetInt16("ts_days"),
                            Men       = reader.GetInt16("ts_men"),
                            PkKey     = reader.GetInt32("ts_oppacketkey"),
                            PrKey     = reader.GetInt32("ts_oppartnerkey"),
                            SubCode1  = reader.GetInt32("ts_subcode1"),
                            SubCode2  = reader.GetInt32("ts_subcode2"),
                            SvKey     = reader.GetInt32("ts_svkey"),
                            Key       = reader.GetInt32("ts_key"),
                            Name      = reader.GetString("ts_name"),
                            Attribute = reader.GetInt32("ts_attribute")
                        };
                        parameters.Add(pars);
                    }
                }
                mainDc.Connection.Close();
            }


            foreach (var pars in parameters)
            {
                var type = Converters.ServiceClassToServiceType(pars.SvKey, pars.Day);
                if (type == ServiceType.Undefined)
                {
                    continue;
                }

                var service = new Service
                {
                    Id          = pars.Key,
                    Description = String.Empty,
                    Name        = pars.Name,
                    IsIncluded  = (pars.Attribute & (int)ServiceAttribute.NotCalculate) != (int)ServiceAttribute.NotCalculate,
                    Type        = type
                };

                if (!service.IsIncluded)
                {
                    var brutto = mainDc.GetServiceCost(pars.SvKey, pars.Code, pars.SubCode1, pars.SubCode2, pars.PrKey,
                                                       pars.PkKey, searchResult.SearchItems[0].Date.AddDays(pars.Day - 1), pars.Days, rateCode, pars.Men, out hashOut);
                    if (brutto.HasValue)
                    {
                        service.Surcharge = (int)brutto;
                    }
                    else
                    {
                        service.Surcharge = 0;
                    }

                    cacheDependencies.Add(hashOut);
                }

                FlightPlainInfo  flightInfo       = null;
                QuotaStatePlaces quotaStatePlaces = null;
                // услуга - перелет туда и в поиске у нас есть о нем информация
                if (type == ServiceType.DptTransport && pars.SubCode2 == Globals.Settings.HomeCityKey && searchResult.SearchItems[0].FlightCalcInfo.CharterKey.HasValue)
                {
                    service.FlightClass = Converters.CharterClassToFlightClass(pars.SubCode1);

                    switch (service.FlightClass)
                    {
                    case FlightClass.Econom:
                        quotaStatePlaces = searchResult.SearchItems[0].DirectFlightsInfo[0].QuotaState;
                        break;

                    case FlightClass.Business:
                        quotaStatePlaces = searchResult.SearchItems[0].DirectFlightsInfo[1].QuotaState;
                        break;
                    }
                    if (quotaStatePlaces != null)
                    {
                        service.FlightAvailability = Converters.QuotaStateToQuotaAvailability(quotaStatePlaces.QuotaState);
                        if (quotaStatePlaces.QuotaState == QuotesStates.Small)
                        {
                            service.FlightPlacesCount = (int)quotaStatePlaces.Places;
                        }
                    }

                    if (searchResult.SearchItems[0].DirectFlightsInfo.Count > 0)
                    {
                        service.FlightStartDateTime = searchResult.SearchItems[0].DirectFlightsInfo[0].FlightDateTimeFrom;
                        service.FlightEndDateTime   = searchResult.SearchItems[0].DirectFlightsInfo[0].FlightDateTimeTo;
                    }

                    flightInfo = searchResult.SearchItems[0].DirectFlightsInfo[0];
                }
                else if (type == ServiceType.RtnTransport && pars.CtKey == Globals.Settings.HomeCityKey && searchResult.SearchItems[0].FlightCalcInfo.BackCharterKey.HasValue)
                {
                    service.FlightClass = Converters.CharterClassToFlightClass(pars.SubCode1);

                    switch (service.FlightClass)
                    {
                    case FlightClass.Econom:
                        quotaStatePlaces = searchResult.SearchItems[0].BackFlightsInfo[0].QuotaState;
                        break;

                    case FlightClass.Business:
                        quotaStatePlaces = searchResult.SearchItems[0].BackFlightsInfo[1].QuotaState;
                        break;
                    }

                    if (searchResult.SearchItems[0].BackFlightsInfo.Count > 0)
                    {
                        service.FlightStartDateTime = searchResult.SearchItems[0].BackFlightsInfo[0].FlightDateTimeFrom;
                        service.FlightEndDateTime   = searchResult.SearchItems[0].BackFlightsInfo[0].FlightDateTimeTo;
                    }

                    flightInfo = searchResult.SearchItems[0].BackFlightsInfo[0];
                }

                if (quotaStatePlaces != null)
                {
                    service.FlightAvailability = Converters.QuotaStateToQuotaAvailability(quotaStatePlaces.QuotaState);
                    if (quotaStatePlaces.QuotaState == QuotesStates.Small)
                    {
                        service.FlightPlacesCount = (int)quotaStatePlaces.Places;
                    }
                }

                if (flightInfo != null)
                {
                    service.FlightAirportFrom = flightInfo.AirportFrom;
                    service.FlightAirportTo   = flightInfo.AirportTo;
                    service.FlightNum         = flightInfo.AirlineCode + " " + flightInfo.FlightNumber;
                    service.FlightAirline     = flightInfo.AirlineCode;
                    service.FlightAircraft    = flightInfo.AircraftCode;
                }
                result.Services.Add(service);
            }

            foreach (var service in result.Services)
            {
                int compId = 0;
                switch (service.Type)
                {
                case ServiceType.DptTransport:
                {
                    var service1 = service;
                    compId = result.Services.Where(s => s.Type == ServiceType.RtnTransport &&
                                                   s.FlightAirportFrom == service1.FlightAirportTo &&
                                                   s.FlightAirportTo == service1.FlightAirportFrom)
                             .Select(s => s.Id)
                             .SingleOrDefault();
                }
                break;

                case ServiceType.RtnTransport:
                {
                    var service1 = service;
                    compId = result.Services.Where(s => s.Type == ServiceType.DptTransport &&
                                                   s.FlightAirportFrom == service1.FlightAirportTo &&
                                                   s.FlightAirportTo == service1.FlightAirportFrom)
                             .Select(s => s.Id)
                             .SingleOrDefault();
                }
                break;
                }
                service.FlightCompatibleIds = compId != 0 ? compId.ToString() : String.Empty;
            }

            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }