Example #1
0
        public SearchResult SearchToursWithPriceForMen(int cityKeyFrom, int countryKey, List <int> tourKeys,
                                                       List <DateTime> tourDates, List <int> tourNights, List <int> hotelKeys, List <int> pansionKeys,
                                                       List <int> roomTypeKeys, QuotesStates hotelQuotaMask, QuotesStates aviaQuotaMask, int rateKey,
                                                       uint?maxTourPrice, ushort rowsPerPage, uint rowCounterFrom, SortingColumn sortingColumn,
                                                       SortingDirection sortingDirection, FlightTicketState flightTicketState)
        {
            if (!IsCountryPriceForMen(countryKey))
            {
                throw new ApplicationException(
                          "Данная страна посчитана с ценами за номер. Используйте для поиска метод SearchToursWithRoomPrice.");
            }

            // ReSharper disable RedundantNameQualifier
            Seemplexity.Services.Wcf.ToursSearch.DataModel.SearchResult searchResult;
            // ReSharper restore RedundantNameQualifier
            using (var mtsDc = new MtSearchDbDataContext())
            {
                using (var mtmDc = new MtMainDbDataContext())
                {
                    searchResult =
                        // ReSharper disable RedundantNameQualifier
                        new Seemplexity.Services.Wcf.ToursSearch.DataModel.SearchResult(mtsDc.PagingOnClient(mtmDc,
                                                                                                             // ReSharper restore RedundantNameQualifier
                                                                                                             cityKeyFrom, countryKey, tourKeys, tourDates, tourNights, hotelKeys,
                                                                                                             pansionKeys, null, null, null, null, roomTypeKeys,
                                                                                                             (QDSearch.DataModel.QuotesStates)hotelQuotaMask,
                                                                                                             (QDSearch.DataModel.QuotesStates)aviaQuotaMask, rateKey, maxTourPrice, rowsPerPage,
                                                                                                             rowCounterFrom,
                                                                                                             new Tuple <QDSearch.DataModel.SortingColumn, QDSearch.DataModel.SortingDirection>(
                                                                                                                 (QDSearch.DataModel.SortingColumn)sortingColumn,
                                                                                                                 (QDSearch.DataModel.SortingDirection)sortingDirection)));
                }
            }

            return(searchResult);
        }
Example #2
0
        /// <summary>
        /// Возвращает список всех QuotaParts's
        /// </summary>
        /// <param name="dc">Контекст базы данных</param>
        /// <returns></returns>
        public static List <QuotaPart> GetAllQuotaParts(this MtSearchDbDataContext dc)
        {
            List <QuotaPart> quotaParts;

            if ((quotaParts = CacheHelper.GetCacheItem <List <QuotaPart> >(TableName)) != null)
            {
                return(quotaParts);
            }
            lock (LockQuotaParts)
            {
                if ((quotaParts = CacheHelper.GetCacheItem <List <QuotaPart> >(TableName)) != null)
                {
                    return(quotaParts);
                }

                quotaParts = (from qp in dc.QuotaParts
                              where qp.QP_Date >= DateTime.Now.Date
                              select qp)
                             .ToList <QuotaPart>();

                CacheHelper.AddCacheData(TableName, quotaParts, null, Globals.Settings.Cache.MediumCacheTimeout);
            }
            return(quotaParts);
        }
Example #3
0
        /// <summary>
        /// Возвращает список квот по заданным параметрам
        /// </summary>
        /// <param name="dc">Контекст базы данных</param>
        /// <param name="serviceClass">Класс услуги</param>
        /// <param name="code">Code услуги (для авиаперелетов - Charter, для проживания - ключ отеля)</param>
        /// <param name="subCode1">SubCode1 услуги, для перелета - класс, для проживания - тип номера (Room)</param>
        /// <param name="subCode2">SubCode1 услуги, для перелета - не используется, для проживания - категория номера (RoomCategory)</param>
        /// <param name="partnerKey">Ключ партнера по услуге</param>
        /// <param name="date">Дата проверки квоты</param>
        /// <param name="agentKey">Ключ агентства</param>
        /// <param name="hash">Хэш кэша</param>
        /// <returns></returns>
        public static List <QuotaPlain> GetPlainQuotasObjects(this MtSearchDbDataContext dc, ServiceClass serviceClass, Int32 code,
                                                              Int32 subCode1, Int32?subCode2, Int32 partnerKey, int?agentKey, DateTime date, out string hash)
        {
            hash = String.Format("{0}_{1}_{2}_{3}", MethodBase.GetCurrentMethod().Name, (int)serviceClass, code,
                                 CacheHelper.GetCacheKeyHashed(new[]
            {
                partnerKey.ToString(),
                agentKey.ToString(),
                subCode1.ToString(),
                subCode2.ToString(),
                date.ToString("yyyy-MM-dd")
            }));
            List <QuotaPlain> result;

            if ((result = CacheHelper.GetCacheItem <List <QuotaPlain> >(hash)) != null)
            {
                return(result);
            }

            string cacheDep;

            result = (from pq in dc.GetPlainQuotasObjects(serviceClass, code, out cacheDep)
                      where (pq.PartnerKey <= 0 || pq.PartnerKey == partnerKey) &&
                      ((agentKey != null && (pq.AgentKey == agentKey.Value || pq.AgentKey == 0)) || (agentKey == null && pq.AgentKey == 0)) &&
                      (pq.SubCode1 <= 0 || pq.SubCode1 == subCode1) &&
                      (subCode2 == null || pq.SubCode2 <= 0 || pq.SubCode2 == subCode2.Value) &&
                      (pq.Date == date)
                      select pq)
                     .ToList();

            CacheHelper.AddCacheData(hash, result, new List <string>()
            {
                cacheDep
            }, Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Example #4
0
        /// <summary>
        /// Получение списка всех стопов на перелеты
        /// </summary>
        /// <param name="dc">Контекст базы данных</param>
        /// <returns></returns>
        public static List <StopAvia> GetAllStopAvia(this MtSearchDbDataContext dc)
        {
            List <StopAvia> stopAvia;

            if ((stopAvia = CacheHelper.GetCacheItem <List <StopAvia> >(TableName)) != default(List <StopAvia>))
            {
                return(stopAvia);
            }
            lock (LockStopAvia)
            {
                if ((stopAvia = CacheHelper.GetCacheItem <List <StopAvia> >(TableName)) != default(List <StopAvia>))
                {
                    return(stopAvia);
                }

                stopAvia = (from s in dc.StopAvias
                            where s.SA_DEND >= DateTime.Now.Date
                            select s)
                           .ToList <StopAvia>();

                CacheHelper.AddCacheData(TableName, stopAvia, TableName);
            }
            return(stopAvia);
        }
Example #5
0
        /// <summary>
        /// Возвращает список всех отелей
        /// </summary>
        /// <param name="dc">Контекст базы данных</param>
        /// <returns></returns>
        public static List <tbl_Country> GetAllCountries(this MtSearchDbDataContext dc)
        {
            List <tbl_Country> countries;

            if ((countries = CacheHelper.GetCacheItem <List <tbl_Country> >(TableName)) != default(List <tbl_Country>))
            {
                return(countries);
            }

            lock (LockCountries)
            {
                if ((countries = CacheHelper.GetCacheItem <List <tbl_Country> >(TableName)) != default(List <tbl_Country>))
                {
                    return(countries);
                }

                countries = (from c in dc.tbl_Countries
                             select c)
                            .ToList <tbl_Country>();

                CacheHelper.AddCacheData(TableName, countries, TableName);
            }
            return(countries);
        }
Example #6
0
        public static IList <Tuple <int, string> > GetCharterScheduleCountriesTo(this MtSearchDbDataContext dc, out string hash)
        {
            List <Tuple <int, string> > result;

            hash = String.Format("{0}", MethodBase.GetCurrentMethod().Name);
            if ((result = CacheHelper.GetCacheItem <List <Tuple <int, string> > >(hash)) != null)
            {
                return(result);
            }

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

            var charterKeys = dc.GetAllCharterKeys(out hashOut);

            cacheDependencies.Add(hashOut);

            var homeCountry = dc.GetHomeCountry(out hashOut);

            cacheDependencies.Add(hashOut);

            result = (from ch in dc.GetAllCharters()
                      join ct in dc.GetAllCities() on ch.CH_CITYKEYTO equals ct.CT_KEY
                      join cn in dc.GetAllCountries() on ct.CT_CNKEY equals cn.CN_KEY
                      where charterKeys.Contains(ch.CH_KEY) &&
                      cn.CN_KEY != homeCountry.CN_KEY
                      select new Tuple <int, string>(cn.CN_KEY, cn.CN_NAME))
                     .Distinct()
                     .ToList();

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

            return(result);
        }
Example #7
0
        /// <summary>
        /// Валюты
        /// </summary>
        /// <param name="searchDc"></param>
        /// <param name="currencyKey">Ключ валюты</param>
        /// <param name="hash"></param>
        /// <returns></returns>
        public static List <Currency> GetCurrencies(this MtSearchDbDataContext searchDc, int?currencyKey, out string hash)
        {
            List <Currency> result;

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

            result = new List <Currency>();
            if (currencyKey == null)
            {
                result.AddRange(searchDc.GetCurrencies().Select(c => new Currency
                {
                    Id   = c.Key,
                    Name = c.Value
                }).ToList());
            }
            else
            {
                var currency = searchDc.GetCurrencies().Where(c => c.Key == currencyKey.Value).Select(c => new Currency
                {
                    Id   = c.Key,
                    Name = c.Value
                }).SingleOrDefault();

                if (currency != null)
                {
                    result.Add(currency);
                }
            }

            CacheHelper.AddCacheData(hash, result, null, Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Example #8
0
        public static IList <CharterSchedulePlainInfo> GetCharterSchedules(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc, int cityKeyFrom, int cityKeyTo, out string hash)
        {
            List <CharterSchedulePlainInfo> result;

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

            result = new List <CharterSchedulePlainInfo>();

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

            var charterKeys = dc.GetAllCharterKeys(out hashOut);

            cacheDependencies.Add(hashOut);

            var chartersTo = (from a in dc.GetAllAirSeasons()
                              join ch in dc.GetAllCharters() on a.AS_CHKEY equals ch.CH_KEY
                              where charterKeys.Contains(ch.CH_KEY) &&
                              ch.CH_CITYKEYFROM == cityKeyFrom &&
                              ch.CH_CITYKEYTO == cityKeyTo &&
                              a.AS_DATEFROM.HasValue &&
                              a.AS_DATETO.HasValue &&
                              a.AS_TIMEFROM.HasValue &&
                              a.AS_TIMETO.HasValue
                              select
                              new CharterSchedulePlainInfoInternal(a.AS_ID, ch.CH_KEY, a.AS_DATEFROM.Value, a.AS_DATETO.Value, a.AS_WEEK,
                                                                   a.AS_TIMEFROM.Value, a.AS_TIMETO.Value, ch.CH_PORTCODEFROM, ch.CH_PORTCODETO, ch.CH_AIRLINECODE,
                                                                   ch.CH_FLIGHT, ch.CH_AIRCRAFT))
                             .Distinct()
                             .ToList();

            var chartersFrom = (from a in dc.GetAllAirSeasons()
                                join ch in dc.GetAllCharters() on a.AS_CHKEY equals ch.CH_KEY
                                where charterKeys.Contains(ch.CH_KEY) &&
                                ch.CH_CITYKEYFROM == cityKeyTo &&
                                ch.CH_CITYKEYTO == cityKeyFrom &&
                                a.AS_DATEFROM.HasValue &&
                                a.AS_DATETO.HasValue &&
                                a.AS_TIMEFROM.HasValue &&
                                a.AS_TIMETO.HasValue
                                select
                                new CharterSchedulePlainInfoInternal(a.AS_ID, ch.CH_KEY, a.AS_DATEFROM.Value, a.AS_DATETO.Value, a.AS_WEEK,
                                                                     a.AS_TIMEFROM.Value, a.AS_TIMETO.Value, ch.CH_PORTCODEFROM, ch.CH_PORTCODETO, ch.CH_AIRLINECODE,
                                                                     ch.CH_FLIGHT, ch.CH_AIRCRAFT))
                               .Distinct()
                               .ToList();

            cacheDependencies.Add(AirSeasonExtension.TableName);
            cacheDependencies.Add(CharterExtension.TableName);

            var seasonKeysDone = new List <int>();

            foreach (var chto in chartersTo)
            {
                var chto1   = chto;
                var chsFrom = chartersFrom.Where(c => c.AirCraft == chto1.AirCraft &&
                                                 c.AirlineCode == chto1.AirlineCode &&
                                                 Math.Abs(c.FlightNumber - chto1.FlightNumber) == 1 &&
                                                 c.PortCodeFrom == chto1.PortCodeTo &&
                                                 c.PortCodeTo == chto1.PortCodeFrom)
                              .ToList();

                var directCharterTimesFrom = chto.CharterDates.Select(d => d.Add(chto.TimeFrom.TimeOfDay)).ToList();

                foreach (var chFrom in chsFrom)
                {
                    var backCharterTimesFrom = chFrom.CharterDates.Select(d => d.Add(chFrom.TimeFrom.TimeOfDay)).ToList();

                    var fitedDates = new List <DateTime>();
                    foreach (var dt in backCharterTimesFrom)
                    {
                        // наши перелеты совершаются с разницей меньше суток, плюч у них сходятся параметры и разнятся номера на 1
                        // значит скорее всего они парные, других параметров проверить их парность у нас нет
                        fitedDates.AddRange(directCharterTimesFrom.Where(d => Math.Abs(d.Subtract(dt).TotalHours) >= 0 && Math.Abs(d.Subtract(dt).TotalHours) < 24));
                    }

                    if (fitedDates.Any())
                    {
                        result.Add(new CharterSchedulePlainInfo
                        {
                            DaysOfWeek            = fitedDates.Select(d => d.DayOfWeek).Distinct().ToList(),
                            AirlineName           = chto1.AirlineCode,
                            DateFrom              = fitedDates.Min(),
                            DateTo                = fitedDates.Max(),
                            AircraftName          = chto1.AirCraft,
                            FlightNum             = chto1.AirlineCode + " " + chto1.FlightNumber + "/" + chFrom.FlightNumber,
                            DirectCharterTime     = chto1.TimeFrom.ToString("HH:mm") + " - " + chto1.TimeTo.ToString("HH:mm"),
                            DirectAirportFromName = chto1.PortCodeFrom,
                            DirectAirportToName   = chto1.PortCodeTo,
                            BackCharterTime       = chFrom.TimeFrom.ToString("HH:mm") + " - " + chFrom.TimeTo.ToString("HH:mm"),
                            BackAirportFromName   = chFrom.PortCodeFrom,
                            BackAirportToName     = chFrom.PortCodeTo
                        });
                        if (!seasonKeysDone.Contains(chto1.AirSeasonKey))
                        {
                            seasonKeysDone.Add(chto1.AirSeasonKey);
                        }

                        if (!seasonKeysDone.Contains(chFrom.AirSeasonKey))
                        {
                            seasonKeysDone.Add(chFrom.AirSeasonKey);
                        }
                    }
                }
            }

            foreach (var chto in chartersTo.Where(c => !seasonKeysDone.Contains(c.AirSeasonKey)))
            {
                var chto1 = chto;
                result.Add(new CharterSchedulePlainInfo
                {
                    DaysOfWeek            = new List <DayOfWeek>(chto1.DaysOfWeek),
                    AirlineName           = chto1.AirlineCode,
                    DateFrom              = chto1.CharterDates.Min(),
                    DateTo                = chto1.CharterDates.Max(),
                    AircraftName          = chto1.AirCraft,
                    FlightNum             = chto1.AirlineCode + " " + chto1.FlightNumber,
                    DirectCharterTime     = chto1.TimeFrom.ToString("HH:mm") + " - " + chto1.TimeTo.ToString("HH:mm"),
                    DirectAirportFromName = chto1.PortCodeFrom,
                    DirectAirportToName   = chto1.PortCodeTo,
                    BackCharterTime       = "---",
                    BackAirportFromName   = "---",
                    BackAirportToName     = "---"
                });

                if (!seasonKeysDone.Contains(chto1.AirSeasonKey))
                {
                    seasonKeysDone.Add(chto1.AirSeasonKey);
                }
            }

            foreach (var chFrom in chartersFrom.Where(c => !seasonKeysDone.Contains(c.AirSeasonKey)))
            {
                var chFrom1 = chFrom;
                result.Add(new CharterSchedulePlainInfo
                {
                    DaysOfWeek            = new List <DayOfWeek>(chFrom1.DaysOfWeek),
                    AirlineName           = chFrom1.AirlineCode,
                    DateFrom              = chFrom1.CharterDates.Min(),
                    DateTo                = chFrom1.CharterDates.Max(),
                    AircraftName          = chFrom1.AirCraft,
                    FlightNum             = chFrom1.AirlineCode + " " + chFrom1.FlightNumber,
                    DirectCharterTime     = "---",
                    DirectAirportFromName = "---",
                    DirectAirportToName   = "---",
                    BackCharterTime       = chFrom1.TimeFrom.ToString("HH:mm") + " - " + chFrom1.TimeTo.ToString("HH:mm"),
                    BackAirportFromName   = chFrom1.PortCodeFrom,
                    BackAirportToName     = chFrom1.PortCodeTo
                });

                if (!seasonKeysDone.Contains(chFrom1.AirSeasonKey))
                {
                    seasonKeysDone.Add(chFrom1.AirSeasonKey);
                }
            }

            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Example #9
0
        /// <summary>
        /// Данные по квотам на перелеты
        /// </summary>
        /// <param name="dc">Контекст БД</param>
        /// <param name="mainDc">Контекст БД</param>
        /// <param name="query">Параметры запроса</param>
        /// <returns></returns>
        public static QuotaPriceResult GetFlightQuotaPrices(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc, QuotaPriceQuery query)
        {
            string hash;

            return(GetFlightQuotaPrices(dc, mainDc, query, out hash));
        }
Example #10
0
 /// <summary>
 /// Метод по выдаче расписаний рейсов
 /// </summary>
 /// <param name="dc">Контекст БД</param>
 /// <param name="mainDc">Контекст БД</param>
 /// <param name="hash">Строка кэша</param>
 /// <returns></returns>
 public static FlightSchedule GetFlightSchedules(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc, out string hash)
 {
     return(dc.GetFlightSchedules(mainDc, null, out hash));
 }
Example #11
0
        /// <summary>
        /// Возвращает сопоставления пар перелетов
        /// </summary>
        /// <param name="dc">Контекст поисковой БД</param>
        /// <param name="mainDc">Контекст основной БД</param>
        /// <param name="packetType">Тип пакета (туда, обратно, туда/обратно)</param>
        /// <param name="flightVariants">Список перелетов</param>
        /// <param name="hash">Хэш кэша</param>
        /// <returns></returns>
        private static IEnumerable <DatesMatches> GetFlightMatches(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc, PacketType packetType, IList <FlightVariant> flightVariants, out string hash)
        {
            List <DatesMatches> result;
            var hashBuilder = new StringBuilder();

            foreach (var flightVaraint in flightVariants)
            {
                hashBuilder.AppendFormat("{0}_", flightVaraint);
            }

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

            if ((result = CacheHelper.GetCacheItem <List <DatesMatches> >(hash)) != null)
            {
                return(result);
            }

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

            if ((PacketType.TwoWayCharters & packetType) == packetType)
            {
                var twoWayTickets = (from flightDateTo in flightVariants
                                     join flightDateFrom in flightVariants on flightDateTo.CityKeyTo equals flightDateFrom.CityKeyFrom
                                     where flightDateTo.CityKeyFrom == Globals.Settings.HomeCityKey &&
                                     flightDateTo.CityKeyFrom == flightDateFrom.CityKeyTo &&
                                     flightDateTo.FlightParamKeys.CharterClassKey == flightDateFrom.FlightParamKeys.CharterClassKey
                                     &&
                                     ((flightDateTo.FlightNumber == flightDateFrom.FlightNumber + 1) ||
                                      (flightDateTo.FlightNumber == flightDateFrom.FlightNumber - 1) ||
                                      (flightDateTo.FlightNumber == flightDateFrom.FlightNumber &&
                                       flightDateTo.FlightParamKeys.CharterKey != flightDateFrom.FlightParamKeys.CharterKey)) &&
                                     (
                                         ((flightDateTo.ArrivalTime - flightDateTo.ArrivalTime.Date) <= (flightDateFrom.DepartTime - flightDateFrom.DepartTime.Date) &&
                                          flightDateTo.ArrivalTime.Date.AddDays(flightDateTo.DurationMin - 1) <= flightDateFrom.DepartTime.Date &&
                                          flightDateTo.ArrivalTime.Date.AddDays(flightDateTo.DurationMax - 1) >= flightDateFrom.DepartTime.Date) ||
                                         ((flightDateTo.ArrivalTime - flightDateTo.ArrivalTime.Date) >
                                          (flightDateFrom.DepartTime - flightDateFrom.DepartTime.Date) &&
                                          flightDateTo.ArrivalTime.Date.AddDays(flightDateTo.DurationMin - 1) <=
                                          flightDateFrom.DepartTime.Date.AddDays(-1) &&
                                          flightDateTo.ArrivalTime.Date.AddDays(flightDateTo.DurationMax - 1) >=
                                          flightDateFrom.DepartTime.Date.AddDays(-1))
                                     )
                                     select new Tuple <FlightVariant, FlightVariant>(new FlightVariant(flightDateTo), new FlightVariant(flightDateFrom)))
                                    .Distinct(new FlightParamsByDateTupleComparer())
                                    .ToList();

                foreach (var pair in twoWayTickets)
                {
                    var query = new QuotaPriceQuery();

                    query.FlightParams.Add(new QuotaPriceParams
                    {
                        DepartTime      = pair.Item1.DepartTime,
                        Duration        = pair.Item2.DepartTime.Date.Subtract(pair.Item1.DepartTime.Date).Days + 1,
                        FlightParamKeys = new FlightVariantKeys
                        {
                            CharterKey      = pair.Item1.FlightParamKeys.CharterKey,
                            CharterClassKey = pair.Item1.FlightParamKeys.CharterClassKey,
                            PacketKey       = pair.Item1.FlightParamKeys.PacketKey,
                            PartnerKey      = pair.Item1.FlightParamKeys.PartnerKey
                        }
                    });
                    query.FlightParams.Add(new QuotaPriceParams
                    {
                        DepartTime      = pair.Item2.DepartTime,
                        Duration        = pair.Item2.DepartTime.Date.Subtract(pair.Item1.DepartTime.Date).Days + 1,
                        FlightParamKeys = new FlightVariantKeys
                        {
                            CharterKey      = pair.Item2.FlightParamKeys.CharterKey,
                            CharterClassKey = pair.Item2.FlightParamKeys.CharterClassKey,
                            PacketKey       = pair.Item2.FlightParamKeys.PacketKey,
                            PartnerKey      = pair.Item2.FlightParamKeys.PartnerKey
                        }
                    });

                    var quotaPrice = dc.GetFlightQuotaPrices(mainDc, query, out hashOut);
                    if (!cacheDependencies.Contains(hashOut))
                    {
                        cacheDependencies.Add(hashOut);
                    }

                    if (quotaPrice.FlightData.Count > 1)
                    {
                        pair.Item1.FlightQuotaPriceData = new QuotaPriceData
                        {
                            PriceValue  = quotaPrice.FlightData[0].PriceValue,
                            QuotaPlaces = quotaPrice.FlightData[0].QuotaPlaces,
                            QuotaState  = quotaPrice.FlightData[0].QuotaState
                        };
                        pair.Item2.FlightQuotaPriceData = new QuotaPriceData
                        {
                            PriceValue  = quotaPrice.FlightData[1].PriceValue,
                            QuotaPlaces = quotaPrice.FlightData[1].QuotaPlaces,
                            QuotaState  = quotaPrice.FlightData[1].QuotaState
                        };
                        result.Add(new DatesMatches
                        {
                            FlightParamsTo   = pair.Item1,
                            FlightParamsFrom = pair.Item2
                        });
                    }
                }
            }
            else if ((PacketType.DirectCharters & packetType) == packetType)
            {
                var directTickets = (from flightDateTo in flightVariants
                                     where flightDateTo.CityKeyFrom == Globals.Settings.HomeCityKey
                                     select flightDateTo)
                                    .Distinct(new FlightParamsByDateComparer())
                                    .ToList();

                foreach (var flight in directTickets)
                {
                    var query = new QuotaPriceQuery();
                    query.FlightParams.Add(new QuotaPriceParams
                    {
                        DepartTime      = flight.DepartTime,
                        FlightParamKeys = new FlightVariantKeys
                        {
                            CharterKey      = flight.FlightParamKeys.CharterKey,
                            CharterClassKey = flight.FlightParamKeys.CharterClassKey,
                            PacketKey       = flight.FlightParamKeys.PacketKey,
                            PartnerKey      = flight.FlightParamKeys.PartnerKey
                        }
                    });

                    var quotaPrice = dc.GetFlightQuotaPrices(mainDc, query, out hashOut);
                    if (!cacheDependencies.Contains(hashOut))
                    {
                        cacheDependencies.Add(hashOut);
                    }

                    if (quotaPrice.FlightData.Count > 0)
                    {
                        flight.FlightQuotaPriceData = new QuotaPriceData
                        {
                            PriceValue  = quotaPrice.FlightData[0].PriceValue,
                            QuotaPlaces = quotaPrice.FlightData[0].QuotaPlaces,
                            QuotaState  = quotaPrice.FlightData[0].QuotaState
                        };
                        result.Add(new DatesMatches
                        {
                            FlightParamsTo   = flight,
                            FlightParamsFrom = null
                        });
                    }
                }
            }
            else if ((PacketType.BackCharters & packetType) == packetType)
            {
                var backTickets = (from flightDateTo in flightVariants
                                   where flightDateTo.CityKeyTo == Globals.Settings.HomeCityKey
                                   select flightDateTo)
                                  .Distinct(new FlightParamsByDateComparer())
                                  .ToList();

                foreach (var flight in backTickets)
                {
                    var query = new QuotaPriceQuery();
                    query.FlightParams.Add(new QuotaPriceParams
                    {
                        DepartTime      = flight.DepartTime,
                        FlightParamKeys = new FlightVariantKeys
                        {
                            CharterKey      = flight.FlightParamKeys.CharterKey,
                            CharterClassKey = flight.FlightParamKeys.CharterClassKey,
                            PacketKey       = flight.FlightParamKeys.PacketKey,
                            PartnerKey      = flight.FlightParamKeys.PartnerKey
                        }
                    });

                    var quotaPrice = dc.GetFlightQuotaPrices(mainDc, query, out hashOut);
                    if (!cacheDependencies.Contains(hashOut))
                    {
                        cacheDependencies.Add(hashOut);
                    }

                    if (quotaPrice.FlightData.Count > 0)
                    {
                        flight.FlightQuotaPriceData = new QuotaPriceData
                        {
                            PriceValue  = quotaPrice.FlightData[0].PriceValue,
                            QuotaPlaces = quotaPrice.FlightData[0].QuotaPlaces,
                            QuotaState  = quotaPrice.FlightData[0].QuotaState
                        };
                        result.Add(new DatesMatches
                        {
                            FlightParamsTo   = null,
                            FlightParamsFrom = flight
                        });
                    }
                }
            }

            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Example #12
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;
                }
            }
        }
Example #13
0
        /// <summary>
        /// Получение списка параметров для квоты "мало" по классам услуг
        /// </summary>
        /// <param name="dc">Контекст базы данных</param>
        /// <returns></returns>
        public static Dictionary <uint, QuotaSmallServiceParams> GetQuotaSmallServiceParams(this MtSearchDbDataContext dc)
        {
            Dictionary <uint, QuotaSmallServiceParams> serviceSmallParams;
            const string hash = "ServiceSmallParams";

            if ((serviceSmallParams = CacheHelper.GetCacheItem <Dictionary <uint, QuotaSmallServiceParams> >(hash)) != default(Dictionary <uint, QuotaSmallServiceParams>))
            {
                return(serviceSmallParams);
            }

            serviceSmallParams = (from s in dc.GetAllServices()
                                  where (s.SV_KEY == 1 || s.SV_KEY == 3)
                                  select s
                                  )
                                 .ToDictionary(s => (uint)s.SV_KEY, s => new QuotaSmallServiceParams
            {
                AndParam     = s.SV_LittleAnd.HasValue && s.SV_LittleAnd.Value,
                PercentParam = (double?)s.SV_LittlePercent,
                PlaceParam   = (uint?)s.SV_LittlePlace
            });

            CacheHelper.AddCacheData(hash, serviceSmallParams, new List <string>()
            {
                TableName
            }, Globals.Settings.Cache.LongCacheTimeout);

            return(serviceSmallParams);
        }
        public void ShowTours(int cityKeyFrom, int countryKey, int[] tourKeys,
                              DateTime[] tourDates, int[] tourNights, int[] hotelKeys,
                              int[] pansionKeys, ushort?mainPlaces, ushort?addPlaces, ushort?firstChildYears,
                              ushort?secondChildYears, int[] roomTypeKeys, QuotesStates hotelQuotaMask, QuotesStates aviaQuotaMask,
                              int rateKey, uint?maxTourPrice, ushort rowsPerPage)
        {
            if (tourKeys == null || !tourKeys.Any())
            {
                throw new ArgumentNullException("tourKeys");
            }
            if (tourDates == null || !tourDates.Any())
            {
                throw new ArgumentNullException("tourDates");
            }
            if (tourNights == null || !tourNights.Any())
            {
                throw new ArgumentNullException("tourNights");
            }
            if (hotelKeys == null || !hotelKeys.Any())
            {
                throw new ArgumentNullException("hotelKeys");
            }
            if (pansionKeys == null || !pansionKeys.Any())
            {
                throw new ArgumentNullException("pansionKeys");
            }
            if ((roomTypeKeys != null && roomTypeKeys.Any() && mainPlaces.HasValue) || ((roomTypeKeys == null || !roomTypeKeys.Any()) && !mainPlaces.HasValue))
            {
                throw new ArgumentException("Одноверменно не могут быть указаны значение количество взрослых и тип номера", "roomTypeKeys");
            }
            if (addPlaces > 0 && !firstChildYears.HasValue)
            {
                throw new ArgumentNullException("firstChildYears", "Не указан возраст первого ребенка");
            }
            if (addPlaces > 1 && !secondChildYears.HasValue)
            {
                throw new ArgumentNullException("secondChildYears", "Не указан возраст второго ребенка");
            }

            CityKeyFrom      = cityKeyFrom;
            CountryKey       = countryKey;
            TourKeys         = tourKeys;
            TourDates        = tourDates;
            TourNights       = tourNights;
            HotelKeys        = hotelKeys;
            PansionKeys      = pansionKeys;
            MainPlaces       = mainPlaces;
            AddPlaces        = addPlaces;
            FirstChildYears  = firstChildYears;
            SecondChildYears = secondChildYears;
            RoomTypeKeys     = roomTypeKeys;
            HotelQuotaMask   = hotelQuotaMask;
            AviaQuotaMask    = aviaQuotaMask;
            RateKey          = rateKey;
            MaxTourPrice     = maxTourPrice;
            RowsPerPage      = rowsPerPage;

            using (var mtmDc = new MtMainDbDataContext())
            {
                using (var mtsDc = new MtSearchDbDataContext())
                {
                    var searchResult = mtsDc.PagingOnClient(mtmDc, CityKeyFrom.Value, CountryKey.Value, TourKeys, TourDates,
                                                            TourNights,
                                                            HotelKeys, PansionKeys, MainPlaces, AddPlaces, FirstChildYears, SecondChildYears,
                                                            RoomTypeKeys,
                                                            HotelQuotaMask, AviaQuotaMask | QuotesStates.None, RateKey.Value, MaxTourPrice, RowsPerPage, 0, CurrentSort);

                    CurrentSort = searchResult.SortType;
                    SearchPages.Clear();

                    if (!searchResult.SearchItems.Any())
                    {
                        LtMessage.Text =
                            @"<div id='SearchResultsMsg' class='TFS_SearchResultsMsg'><span>К сожалению по вашему запросу ничего не найдено. Попробуйте изменить параметры поиска. Например квоты или количество едущих людей и т.д.</span></div>";
                        Web.ShowMessage(this,
                                        @"К сожалению по вашему запросу ничего не найдено. Попробуйте изменить параметры поиска. Например квоты или количество едущих людей и т.д.");
                        Web.ScrollToElement(this, "SearchResultsMsg");

                        //koshelev
                        //сделал обработку того, что ни один тур не найден
                        RepFindedTours.DataSource = null;
                        RepFindedTours.DataBind();

                        RepPagesTop.DataSource = null;
                        RepPagesTop.DataBind();
                        RepPagesBottom.DataSource = null;
                        RepPagesBottom.DataBind();
                        return;
                    }

                    LtMessage.Text = String.Empty;

                    // добовляем первую страницу
                    SearchPages.Add(1, 0);
                    CurrentPage = 1;

                    // инициализируем следующую страницу
                    if (searchResult.IsMorePages)
                    {
                        SearchPages.Add(CurrentPage + 1, searchResult.NextPageRowCounter);
                    }

                    RepPagesTop.DataSource = SearchPages;
                    RepPagesTop.DataBind();
                    RepPagesBottom.DataSource = SearchPages;
                    RepPagesBottom.DataBind();

                    RepFindedTours.DataSource = searchResult.SearchItems;
                    RepFindedTours.DataBind();
                }
            }
        }
Example #15
0
        /// <summary>
        /// ПОлучения плоского списка квот из БД по параметрам. Загружается сразу на все даты для уменьшения числа обращений к БД
        /// </summary>
        /// <param name="dc">Контекст БД</param>
        /// <param name="serviceClass">Класс услуги</param>
        /// <param name="code">Code услуги (для перелета - ключ чартера, для отеля - ключ отеля)</param>
        /// <param name="hash">Хэш кэша</param>
        /// <returns></returns>
        public static List <QuotaPlain> GetPlainQuotasObjects(this MtSearchDbDataContext dc, ServiceClass serviceClass, Int32 code, out string hash)
        {
            hash = String.Format("{0}_{1}_{2}", MethodBase.GetCurrentMethod().Name, (int)serviceClass, code);

            List <QuotaPlain> result;

            if ((result = CacheHelper.GetCacheItem <List <QuotaPlain> >(hash)) != null)
            {
                return(result);
            }

            var cacheDependencies = new List <string>
            {
                String.Format("{0}_{1}_{2}", CacheHelper.QuotaHash, (int)serviceClass, code)
            };

            result = new List <QuotaPlain>();

            var commandBuilder = new StringBuilder();

            commandBuilder.AppendLine("select SS_QDID, QD_Type, SS_AllotmentAndCommitment, QP_Busy, QP_CheckInPlacesBusy, QP_Places, QP_CheckInPlaces, QP_Durations, QO_ID, SS_ID, QD_ID, ISNULL(QT_PRKey, 0) as QT_PRKey, ISNULL(QP_AgentKey, 0) as QP_AgentKey, ISNULL(QO_SubCode1, 0) as QO_SubCode1, ISNULL(QO_SubCode2, 0) as QO_SubCode2, QD_Date, QD_Release ");
            commandBuilder.AppendLine("from Quotas ");
            commandBuilder.AppendLine("join QuotaObjects on QO_QTID = QT_ID ");
            commandBuilder.AppendLine("join QuotaDetails on QD_QTID = QT_ID ");
            commandBuilder.AppendLine("join QuotaParts on QP_QDID = QD_ID ");
            commandBuilder.AppendLine("left join StopSales on SS_QDID = QD_ID and (SS_IsDeleted is null or SS_IsDeleted = 0) ");
            commandBuilder.AppendLine(String.Format("where QO_SVKey = {0} ", (int)serviceClass));
            commandBuilder.AppendLine(String.Format("and QO_Code = {0} ", code));
            commandBuilder.AppendLine("and (SS_Date is null or SS_Date = QD_Date) ");
            commandBuilder.AppendLine("and (QP_IsDeleted is null or QP_IsDeleted = 0) ");
            commandBuilder.AppendLine("and (QD_IsDeleted is null or QD_IsDeleted = 0) ");
            //commandBuilder.AppendLine("and (QP_AgentKey is null or QP_AgentKey = 0) ");
            commandBuilder.AppendLine("and (QP_IsNotCheckin is null or QP_IsNotCheckin = 0) ");
            commandBuilder.AppendLine(String.Format("and QD_Date >= '{0:yyyy-MM-dd}'", DateTime.Now.Date));
            commandBuilder.AppendLine("union ");
            commandBuilder.AppendLine("select null as SS_QDID, null as QD_Type, SS_AllotmentAndCommitment, 0 as QP_Busy, 0 as QP_CheckInPlacesBusy, 0 as QP_Places, 0 as QP_CheckInPlaces, '' as QP_Durations, QO_ID, SS_ID, 0 as QD_ID, SS_PRKey as QT_PRKey, 0 as QP_AgentKey, ISNULL(QO_SubCode1, 0) as QO_SubCode1, ISNULL(QO_SubCode2, 0) as QO_SubCode2, SS_Date as QD_Date, null as QD_Release ");
            commandBuilder.AppendLine("from QuotaObjects ");
            commandBuilder.AppendLine("join StopSales on SS_QOID = QO_ID ");
            commandBuilder.AppendLine("where QO_QTID is null ");
            commandBuilder.AppendLine("and (SS_IsDeleted is null or SS_IsDeleted = 0) ");
            commandBuilder.AppendLine(String.Format("and QO_SVKey = {0} ", (int)serviceClass));
            commandBuilder.AppendLine(String.Format("and QO_Code = {0} ", code));
            commandBuilder.AppendLine(String.Format("and SS_Date >= '{0:yyyy-MM-dd}'", DateTime.Now.Date));

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

                dc.Connection.Open();
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        result.Add(new QuotaPlain()
                        {
                            SsQdId = reader.GetInt32OrNull("SS_QDID"),
                            Type   = reader.GetInt16OrNull("QD_Type") == null || reader.GetInt16OrNull("QD_Type") == 1 ? QuotaType.Allotment : QuotaType.Commitment,
                            IsAllotmentAndCommitment = reader.GetBooleanOrNull("SS_AllotmentAndCommitment") != null && reader.GetBooleanOrNull("SS_AllotmentAndCommitment") != false,
                            Busy = reader.GetInt32("QP_Busy"),
                            CheckInPlacesBusy = reader.GetInt32OrNull("QP_CheckInPlacesBusy"),
                            Places            = reader.GetInt32("QP_Places"),
                            CheckInPlaces     = reader.GetInt32OrNull("QP_CheckInPlaces"),
                            Duration          = reader.GetString("QP_Durations"),
                            QoId       = reader.GetInt32("QO_ID"),
                            SsId       = reader.GetInt32OrNull("SS_ID"),
                            QdId       = reader.GetInt32("QD_ID"),
                            PartnerKey = reader.GetInt32("QT_PRKey"),
                            AgentKey   = reader.GetInt32("QP_AgentKey"),
                            SubCode1   = reader.GetInt32("QO_SubCode1"),
                            SubCode2   = reader.GetInt32("QO_SubCode2"),
                            Date       = reader.GetDateTime("QD_Date"),
                            Release    = reader.GetInt16OrNull("QD_Release")
                        });
                    }
                }
                dc.Connection.Close();
            }

            CacheHelper.AddCacheData(hash, result, cacheDependencies, Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Example #16
0
 /// <summary>
 /// Реальный курс на дату
 /// </summary>
 /// <param name="dc">Контекст базы данных</param>
 /// <param name="date">Дата курса</param>
 /// <param name="rateCodeFrom">Валюта, из которой конвертируем</param>
 /// <param name="rateCodeTo">Валюта, в которую конвертируем</param>
 /// <returns></returns>
 public static decimal GetRateRealCourse(this MtSearchDbDataContext dc, DateTime date, string rateCodeFrom, string rateCodeTo)
 {
     return(dc.GetRateRealCourse(date, dc.GetRateKeyByCode(rateCodeFrom), dc.GetRateKeyByCode(rateCodeTo)));
 }
Example #17
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);
                    }
                }
            }
        }
Example #18
0
        /// <summary>
        /// Проверяет квоту на всю услугу по параметрам
        /// </summary>
        /// <param name="dc">Контекст базы данных</param>
        /// <param name="serviceClass">Класс услуги</param>
        /// <param name="code">Code услуги (для авиаперелетов - Charter, для проживания - ключ отеля)</param>
        /// <param name="subCode1">SubCode1 услуги, для перелета - класс, для проживания - тип номера (Room)</param>
        /// <param name="subCode2">SubCode1 услуги, для перелета - не используется, для проживания - категория номера (RoomCategory)</param>
        /// <param name="partnerKey">Ключ партнера по услуге</param>
        /// <param name="serviceDateFrom">Дата начала услуги</param>
        /// <param name="serviceDateTo">Дата окончания услуги</param>
        /// <param name="agentKey">Ключ агентства</param>
        /// <param name="hash">Хэш кэша</param>
        /// <returns></returns>
        public static QuotaStatePlaces CheckServiceQuota(this MtSearchDbDataContext dc, ServiceClass serviceClass, Int32 code,
                                                         Int32 subCode1, Int32?subCode2, Int32 partnerKey, int?agentKey, DateTime serviceDateFrom, DateTime serviceDateTo,
                                                         out string hash)
        {
            hash = String.Format("{0}_{1}_{2}_{3}", MethodBase.GetCurrentMethod().Name, (int)serviceClass, code, CacheHelper.GetCacheKeyHashed(new[]
            {
                subCode1.ToString(),
                subCode2.ToString(),
                partnerKey.ToString(),
                agentKey.ToString(),
                serviceDateFrom.ToString("yyyy-MM-dd"),
                serviceDateTo.ToString("yyyy-MM-dd")
            }));

            var cacheDependecies = new List <string>();
            QuotaStatePlaces result;

            if ((result = CacheHelper.GetCacheItem <QuotaStatePlaces>(hash)) != null)
            {
                return(result);
            }

            int duration;

            result = new QuotaStatePlaces()
            {
                IsCheckInQuota = false, Places = 0, QuotaState = QuotesStates.Request
            };
            if (serviceClass == ServiceClass.Flight)
            {
                DateTime linkedDate1, linkedDate2;
                if (serviceDateFrom <= serviceDateTo)
                {
                    linkedDate1 = serviceDateFrom;
                    linkedDate2 = serviceDateTo;
                }
                else
                {
                    linkedDate1 = serviceDateTo;
                    linkedDate2 = serviceDateFrom;
                }
                duration = linkedDate2.Subtract(linkedDate1).Days + 1;
            }
            else
            {
                duration = serviceDateTo.Subtract(serviceDateFrom).Days + 1;
            }

            if (serviceClass == ServiceClass.Flight)
            {
                serviceDateTo = serviceDateFrom;
            }

            var quotasStatusesByDays = new Dictionary <DateTime, QuotaStatePlaces>(duration);

            for (var date = serviceDateFrom; date <= serviceDateTo; date = date.AddDays(1))
            {
                string hashOut;
                quotasStatusesByDays.Add(date, dc.CheckServiceQuotaByDay(serviceClass, code, subCode1, subCode2, partnerKey, agentKey, date, duration, date == serviceDateFrom, out hashOut));
                cacheDependecies.Add(hashOut);
            }

            if (quotasStatusesByDays.Values.Any(s => s.QuotaState == QuotesStates.No))
            {
                result.QuotaState = QuotesStates.No;
            }
            else if (quotasStatusesByDays.Values.Any(s => s.QuotaState == QuotesStates.Request))
            {
                result.QuotaState = QuotesStates.Request;
            }
            else if (quotasStatusesByDays.Values.Any(s => s.QuotaState == QuotesStates.Small))
            {
                result.QuotaState = QuotesStates.Small;
            }
            else if (quotasStatusesByDays.Values.Any(s => s.QuotaState == QuotesStates.Availiable))
            {
                result.QuotaState = QuotesStates.Availiable;
            }

            if (result.QuotaState == QuotesStates.Availiable || result.QuotaState == QuotesStates.Small)
            {
                result.Places = quotasStatusesByDays.Values.Min(s => s.Places);
            }

            if (quotasStatusesByDays.Values.Any(s => s.IsCheckInQuota))
            {
                var checkInState = quotasStatusesByDays.Values.Where(s => s.IsCheckInQuota).Select(s => s).SingleOrDefault();
                if (checkInState != null && QuotasExtension.OrderderQuotaStates[checkInState.QuotaState] > QuotasExtension.OrderderQuotaStates[result.QuotaState])
                {
                    result = checkInState;
                }
            }

            CacheHelper.AddCacheData(hash, result, cacheDependecies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
        protected void RepPagesItem_Command(object sender, CommandEventArgs e)
        {
            var linkButton = sender as LinkButton;

            if (linkButton == null)
            {
                throw new ArgumentNullException("sender");
            }
            if (e == null)
            {
                throw new ArgumentNullException("e");
            }

            using (var mtmDc = new MtMainDbDataContext())
            {
                using (var mtsDc = new MtSearchDbDataContext())
                {
                    switch (e.CommandName)
                    {
                    case "PreviosPage":
                        CurrentPage--;
                        break;

                    case "PageToGo":
                        CurrentPage = uint.Parse(e.CommandArgument.ToString());
                        break;

                    case "NextPage":
                        CurrentPage++;
                        break;

                    default:
// ReSharper disable once NotResolvedInText
                        throw new ArgumentOutOfRangeException("e.CommandName", e.CommandName,
                                                              "Событие получено от незарегестрированого элемента.");
                    }

                    if (1 > CurrentPage || CurrentPage > SearchPages.Count)
                    {
                        throw new IndexOutOfRangeException(
                                  String.Format("Индекс текущей страницы поиска вышел за границы диапозона - {0}", CurrentPage));
                    }

                    var searchResult = mtsDc.PagingOnClient(mtmDc, CityKeyFrom.Value, CountryKey.Value, TourKeys, TourDates,
                                                            TourNights,
                                                            HotelKeys, PansionKeys, MainPlaces, AddPlaces, FirstChildYears, SecondChildYears,
                                                            RoomTypeKeys,
                                                            HotelQuotaMask, AviaQuotaMask | QuotesStates.None, RateKey.Value, MaxTourPrice, RowsPerPage,
                                                            SearchPages[CurrentPage],
                                                            CurrentSort);

                    CurrentSort = searchResult.SortType;

                    if (searchResult.IsMorePages && !SearchPages.ContainsKey(CurrentPage + 1))
                    {
                        SearchPages.Add(CurrentPage + 1, searchResult.NextPageRowCounter);
                    }

                    RepPagesTop.DataSource = SearchPages;
                    RepPagesTop.DataBind();
                    RepPagesBottom.DataSource = SearchPages;
                    RepPagesBottom.DataBind();

                    RepFindedTours.DataSource = searchResult.SearchItems;
                    RepFindedTours.DataBind();

                    Web.ScrollToElement(this, RepPagesTop.ClientID);
                    linkButton.Focus();
                }
            }
        }
Example #20
0
        /// <summary>
        /// Метод по проверке квот на перелет
        /// </summary>
        /// <param name="dc">Контекст БД</param>
        /// <param name="mainDc">Контекст основной БД</param>
        /// <param name="charterKey">Ключ перелета</param>
        /// <param name="cityKeyFrom">Ключ города вылета</param>
        /// <param name="cityKeyTo">Ключ города прилета</param>
        /// <param name="charterDay">День вылета в туре</param>
        /// <param name="partnerKey">Ключ партнера по перелету</param>
        /// <param name="agentKey">Ключ агентства</param>
        /// <param name="packetKey">Ключ пакета</param>
        /// <param name="tourDate">Дата тура</param>
        /// <param name="linkedDay">День вылета парного перелета</param>
        /// <param name="findFlight">Признак "подбирать или не подбирать" перелет</param>
        /// <param name="placesToCheck">Количество мест, которые должны быть в квоте, чтобы она считалась подходящей</param>
        /// <param name="flightGroups">Группы перелетов (эконом, бизнес, премиум)</param>
        /// <param name="hash">Хэш кэша</param>
        /// <param name="aviaQuotaMask">Маска квот на перелет</param>
        /// <returns></returns>
        public static Dictionary <int, FlightPlainInfo> CheckCharterQuota(this MtSearchDbDataContext dc,
                                                                          MtMainDbDataContext mainDc,
                                                                          Int32 charterKey, Int32 cityKeyFrom, Int32 cityKeyTo,
                                                                          Int32 charterDay, int partnerKey, int?agentKey, int packetKey, DateTime tourDate, Int32?linkedDay,
                                                                          bool findFlight, QuotesStates aviaQuotaMask, Int32 placesToCheck, IDictionary <int, IEnumerable <int> > flightGroups, out string hash)
        {
            Dictionary <int, FlightPlainInfo> result;

            hash = String.Format("{0}_{1}_{2}", MethodBase.GetCurrentMethod().Name, charterKey,
                                 CacheHelper.GetCacheKeyHashed(new[]
            {
                cityKeyFrom.ToString(),
                cityKeyTo.ToString(),
                partnerKey.ToString(),
                agentKey.ToString(),
                charterDay.ToString(), packetKey.ToString(), tourDate.ToString("yyyy-MM-dd"), linkedDay.ToString(),
                findFlight.ToString(),
                aviaQuotaMask.ToString(),
                placesToCheck.ToString(),
                String.Join("_", flightGroups.Keys),
                String.Join("_", flightGroups.Values)
            }));

            if ((result = CacheHelper.GetCacheItem <Dictionary <int, FlightPlainInfo> >(hash)) != null)
            {
                return(result);
            }
            var    cacheDependencies = new List <string>();
            string hashOut;

            var flightsInfo = dc.GetCharterAllQuota(mainDc, charterKey, cityKeyFrom, cityKeyTo,
                                                    charterDay, partnerKey, agentKey, packetKey, tourDate, linkedDay,
                                                    findFlight, flightGroups, out hashOut);

            result = new Dictionary <int, FlightPlainInfo>();
            foreach (var key in flightsInfo.Keys)
            {
                var quotaIsOk = false;
                var tempState = new FlightPlainInfo();
                foreach (var flightInfo in flightsInfo[key])
                {
                    var quotaState = flightInfo.QuotaState;
                    var maskIsOk   = ((quotaState.QuotaState == QuotesStates.Small && (aviaQuotaMask & QuotesStates.Availiable) == QuotesStates.Availiable) ||
                                      (quotaState.QuotaState & aviaQuotaMask) == quotaState.QuotaState);

                    if (!maskIsOk)
                    {
                        continue;
                    }

                    if ((quotaState.QuotaState == QuotesStates.Availiable || quotaState.QuotaState == QuotesStates.Small) && quotaState.Places < placesToCheck && (aviaQuotaMask & QuotesStates.Request) != QuotesStates.Request)
                    {
                        continue;
                    }

                    if (QuotasExtension.OrderderQuotaStates[flightInfo.QuotaState.QuotaState] > QuotasExtension.OrderderQuotaStates[tempState.QuotaState.QuotaState] ||
                        (tempState.QuotaState.QuotaState == flightInfo.QuotaState.QuotaState && flightInfo.QuotaState.Places > tempState.QuotaState.Places))
                    {
                        tempState = flightInfo;
                        quotaIsOk = true;
                    }

                    if (tempState.QuotaState.QuotaState == QuotesStates.Availiable)
                    {
                        break;
                    }
                }
                if (quotaIsOk)
                {
                    result.Add(key, new FlightPlainInfo(tempState));
                }
            }

            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Example #21
0
        public static List <FlightVariant> GetCharterDates(this MtSearchDbDataContext dc, FlightVariantKeys flightParams, out string hash)
        {
            List <FlightVariant> result;

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

            var cacheDependencies = new List <string>();
            var charterSchedules  = (from a in dc.GetAllAirSeasons()
                                     where a.AS_CHKEY == flightParams.CharterKey &&
                                     a.AS_TIMEFROM != null &&
                                     a.AS_TIMETO != null
                                     select a)
                                    .ToList();

            cacheDependencies.Add(QDSearch.Extensions.AirSeasonExtension.TableName);

            result = new List <FlightVariant>();
            foreach (var airSeason in charterSchedules)
            {
                var dateFrom = airSeason.AS_DATEFROM.Value > DateTime.Now ? airSeason.AS_DATEFROM.Value : DateTime.Now;
                for (var date = dateFrom; date <= airSeason.AS_DATETO; date = date.AddDays(1))
                {
                    var dayOfWeek = (int)date.DayOfWeek;
                    if (airSeason.AS_WEEK.Contains(dayOfWeek.ToString()))
                    {
                        var timeFrom   = airSeason.AS_TIMEFROM;
                        var timeTo     = airSeason.AS_TIMETO;
                        var dateTo     = airSeason.AS_TIMEFROM <= airSeason.AS_TIMETO ? date : date.AddDays(1);
                        var departTime = new DateTime(date.Year, date.Month, date.Day, timeFrom.Value.Hour,
                                                      timeFrom.Value.Minute, 0);
                        var arrivalTime = new DateTime(dateTo.Year, dateTo.Month, dateTo.Day, timeTo.Value.Hour,
                                                       timeFrom.Value.Minute, 0);

                        var flightParamsByDate = new FlightVariant
                        {
                            FlightParamKeys = flightParams,
                            DepartTime      = departTime,
                            ArrivalTime     = arrivalTime
                        };
                        result.Add(flightParamsByDate);

                        //string hashOut;
                        // определяем есть ли цена на перелет в принципе
                        //var cost = dc.GetFlightCost(flightParams.CharterKey, flightParams.CharterClassKey,
                        //    flightParams.PartnerKey, flightParams.PacketKey, departTime, -1, out hashOut);

                        //cacheDependencies.Add(hashOut);

                        //if (cost != null && cost.Price != null)
                        //{
                        //var flightParamsByDate = new ParamsByDate()
                        //{
                        //    FlightParamKeys = flightParams,
                        //    DepartTime = departTime,
                        //    ArrivalTime = arrivalTime
                        //};
                        //result.Add(flightParamsByDate);
                        //}
                    }
                }
            }

            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Example #22
0
        /// <summary>
        /// Проверяет квоту на конкретный день по параметрам. Для услуг с продолжительностью этот метод нужно вызвать на каждый день
        /// </summary>
        /// <param name="dc">Контекст базы данных</param>
        /// <param name="serviceClass">Класс услуги</param>
        /// <param name="code">Code услуги (для авиаперелетов - Charter, для проживания - ключ отеля)</param>
        /// <param name="subCode1">SubCode1 услуги, для перелета - класс, для проживания - тип номера (Room)</param>
        /// <param name="subCode2">SubCode1 услуги, для перелета - не используется, для проживания - категория номера (RoomCategory)</param>
        /// <param name="partnerKey">Ключ партнера по услуге</param>
        /// <param name="date">Дата проверки квоты</param>
        /// <param name="duration">Продолжительность услуги (нужна для подбора квот на продолжительность)</param>
        /// <param name="isTheFirstDay">Является ли проверяемая дата первым днем или нет (нужно для подбора квот на заезд)</param>
        /// <param name="agentKey">КЛюч агентства</param>
        /// <param name="hash">Хэш кэша</param>
        /// <returns></returns>
        public static QuotaStatePlaces CheckServiceQuotaByDay(this MtSearchDbDataContext dc, ServiceClass serviceClass, Int32 code,
                                                              Int32 subCode1, Int32?subCode2, Int32 partnerKey, int?agentKey, DateTime date, int duration, bool isTheFirstDay, out string hash)
        {
            QuotaStatePlaces result;

            hash = String.Format("{0}_{1}_{2}_{3}", MethodBase.GetCurrentMethod().Name, (int)serviceClass, code,
                                 CacheHelper.GetCacheKeyHashed(new[]
            {
                subCode1.ToString(),
                subCode2.ToString(),
                partnerKey.ToString(),
                agentKey.ToString(),
                date.ToString("yyyy-MM-dd"),
                duration.ToString(),
                isTheFirstDay.ToString()
            }));

            if ((result = CacheHelper.GetCacheItem <QuotaStatePlaces>(hash)) != null)
            {
                return(result);
            }

            var cacheDependecies = new List <string>();

            result = new QuotaStatePlaces();

            string hashOut;
            var    plainQuotasByDate = dc.GetPlainQuotasObjects(serviceClass, code, subCode1, subCode2, partnerKey, agentKey, date, out hashOut);

            cacheDependecies.Add(hashOut);

            plainQuotasByDate =
                plainQuotasByDate.Where(q => q.Duration.Split(',').Contains(duration.ToString()) || q.Duration == String.Empty)
                .ToList();

            if (!plainQuotasByDate.Any())
            {
                result.QuotaState = QuotesStates.Request;
            }

            var ssQoIds = new List <bool>();

            foreach (var plainQuota in plainQuotasByDate.OrderByDescending(p => p.SsId))
            {
                ////стоит какой-то стоп
                if (plainQuota.SsId != null)
                {
                    //стоит общий стоп
                    if (plainQuota.SsQdId == null)
                    {
                        // стоп только на Allotment, или еще и на Commitment
                        ssQoIds.Add(plainQuota.IsAllotmentAndCommitment);
                    }

                    if (result.QuotaState == QuotesStates.None)
                    {
                        result.QuotaState = QuotesStates.No;
                    }

                    continue;
                }

                //стопа на текущей строке нет, но есть общий стоп, который подходит под эту строку
                //в переменной result.QuotaState у нас и так уже QuotesStates.No, но проставлю еще раз для наглядности
                if (ssQoIds.Any(s => s || plainQuota.Type == QuotaType.Allotment))
                {
                    result.QuotaState = QuotesStates.No;
                    continue;
                }

                //наступил релиз-период
                //todo: сделать настройку в web.config
                if (plainQuota.Release != null && (plainQuota.Date.Subtract(DateTime.Now).Days < plainQuota.Release))
                {
                    if (result.QuotaState == QuotesStates.None || result.QuotaState == QuotesStates.No)
                    {
                        result.QuotaState = QuotesStates.Request;
                    }

                    continue;
                }

                // проверяем квоту на заезд или на период
                if (serviceClass == ServiceClass.Flight ||
                    (serviceClass == ServiceClass.Hotel &&
                     ((plainQuota.CheckInPlaces ?? 0) <= 0 || plainQuota.CheckInPlacesBusy == null)))
                {
                    var state = dc.GetQuotesStateByInt(serviceClass, plainQuota.Places - plainQuota.Busy, plainQuota.Places, out hashOut);
                    cacheDependecies.Add(hashOut);

                    // или на эту дату не было статуса квотирования, либо мы нашли статус на текущую дату и он лучше
                    if (QuotasExtension.OrderderQuotaStates[result.QuotaState] < QuotasExtension.OrderderQuotaStates[state])
                    {
                        result.QuotaState = state;
                        result.Places    += (uint)(plainQuota.Places - plainQuota.Busy);
                    }
                }
                else if (isTheFirstDay)
                {
                    // нашли квоту на заезд
                    var checkInState = dc.GetQuotesStateByInt(serviceClass, plainQuota.Places - plainQuota.Busy, plainQuota.Places, out hashOut);
                    cacheDependecies.Add(hashOut);

                    result.Places         = (uint)(plainQuota.Places - plainQuota.Busy);
                    result.QuotaState     = checkInState;
                    result.IsCheckInQuota = true;
                }
            }

            CacheHelper.AddCacheData(hash, result, cacheDependecies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Example #23
0
        /// <summary>
        /// Возвращает список перелетов по пакету
        /// </summary>
        /// <param name="dc">Контекст поисковой БД</param>
        /// <param name="mainDc">Контекст основной БД</param>
        /// <param name="packetKey">Ключ пакета</param>
        /// <param name="hash">Хэш кэша</param>
        /// <returns></returns>
        private static IList <FlightVariant> GetFlightParamsByDate(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc, int packetKey, out string hash)
        {
            List <FlightVariant> result;

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

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

            result = new List <FlightVariant>();


            var charterCosts = (from ch in dc.GetAllCharters()
                                join cs in dc.GetFlightCostsByPacketKey(packetKey, out hashOut) on ch.CH_KEY equals cs.CS_CODE
                                select new
            {
                CH_Key = ch.CH_KEY,
                CH_Flight = ch.CH_FLIGHT,
                CS_SubCode1 = cs.CS_SUBCODE1,
                CS_PRKey = cs.CS_PRKEY,
                CS_PKKey = cs.CS_PKKEY,
                CH_PortCodeFrom = ch.CH_PORTCODEFROM,
                CH_CityKeyFrom = ch.CH_CITYKEYFROM,
                CH_PortCodeTo = ch.CH_PORTCODETO,
                CH_CityKeyTo = ch.CH_CITYKEYTO,
                CH_AirlineCode = ch.CH_AIRLINECODE,
                CH_Aircraft = ch.CH_AIRCRAFT,
                CS_LongMin = cs.CS_LONGMIN,
                CS_Long = cs.CS_LONG
            })
                               .ToList();

            cacheDependencies.Add(hashOut);
            cacheDependencies.Add(CharterExtension.TableName);

            foreach (var charterCost in charterCosts)
            {
                int flightNumber;
                if (!Int32.TryParse(charterCost.CH_Flight, out flightNumber))
                {
                    flightNumber = 0;
                }

                var flightParamKeys = new FlightVariantKeys
                {
                    CharterKey      = charterCost.CH_Key,
                    CharterClassKey = charterCost.CS_SubCode1.Value,
                    PartnerKey      = charterCost.CS_PRKey,
                    PacketKey       = charterCost.CS_PKKey.Value
                };

                var flightDatesTemp = dc.GetCharterDates(flightParamKeys, out hashOut);
                if (!cacheDependencies.Contains(hashOut))
                {
                    cacheDependencies.Add(hashOut);
                }

                var packetDatesTemp = mainDc.GetDatesByTours(new List <int> {
                    packetKey
                }, out hashOut).Select(d => d.Item2).ToList();
                if (!cacheDependencies.Contains(hashOut))
                {
                    cacheDependencies.Add(hashOut);
                }

                foreach (var flightParamsByDate in flightDatesTemp.Where(fd => packetDatesTemp.Contains(fd.DepartTime.Date)))
                {
                    flightParamsByDate.CharterClassCode =
                        dc.GetAirServiceByKey(charterCost.CS_SubCode1.Value).AS_CODE;
                    flightParamsByDate.PortCodeFrom = charterCost.CH_PortCodeFrom;
                    flightParamsByDate.CityKeyFrom  = charterCost.CH_CityKeyFrom;
                    flightParamsByDate.PortCodeTo   = charterCost.CH_PortCodeTo;
                    flightParamsByDate.CityKeyTo    = charterCost.CH_CityKeyTo;
                    flightParamsByDate.AirlineCode  = charterCost.CH_AirlineCode;
                    flightParamsByDate.FlightNumber = flightNumber;
                    flightParamsByDate.AircraftType = charterCost.CH_Aircraft;

                    var durationMin = charterCost.CS_LongMin;
                    var durationMax = charterCost.CS_Long;
                    flightParamsByDate.DurationMin = durationMin == null ? (short)0 : durationMin.Value;
                    flightParamsByDate.DurationMax = durationMax ?? 999;

                    result.Add(flightParamsByDate);
                }
            }

            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Example #24
0
        /// <summary>
        /// Метод по проверке квот на перелет (можно использовать для вывода информации о перелетах п строке)
        /// </summary>
        /// <param name="dc">Контекст БД</param>
        /// <param name="mainDc">Контекст основной БД</param>
        /// <param name="charterKey">Ключ перелета</param>
        /// <param name="cityKeyFrom">Ключ города вылета</param>
        /// <param name="cityKeyTo">Ключ города прилета</param>
        /// <param name="charterDay">День вылета в туре</param>
        /// <param name="partnerKey">Ключ партнера по перелету</param>
        /// <param name="agentKey">Ключ агентства</param>
        /// <param name="packetKey">Ключ пакета</param>
        /// <param name="tourDate">Дата тура</param>
        /// <param name="linkedDay">День вылета парного перелета</param>
        /// <param name="findFlight">Признак "подбирать или не подбирать" перелет</param>
        /// <param name="flightGroups">Группы перелетов (эконом, бизнес, премиум)</param>
        /// <param name="hash">Хэш кэша</param>
        /// <returns></returns>
        public static Dictionary <int, List <FlightPlainInfo> > GetCharterAllQuota(this MtSearchDbDataContext dc,
                                                                                   MtMainDbDataContext mainDc,
                                                                                   Int32 charterKey, Int32 cityKeyFrom, Int32 cityKeyTo,
                                                                                   Int32 charterDay, int partnerKey, int?agentKey, int packetKey, DateTime tourDate, Int32?linkedDay,
                                                                                   bool findFlight, IDictionary <int, IEnumerable <int> > flightGroups, out string hash)
        {
            var    cacheDependencies = new List <string>();
            string cacheDep;

            hash = String.Format("{0}_{1}_{2}", MethodBase.GetCurrentMethod().Name, charterKey,
                                 CacheHelper.GetCacheKeyHashed(new[]
            {
                cityKeyFrom.ToString(),
                cityKeyTo.ToString(),
                partnerKey.ToString(),
                agentKey.ToString(),
                charterDay.ToString(), packetKey.ToString(), tourDate.ToString("yyyy-MM-dd"), linkedDay.ToString(),
                findFlight.ToString(),
                String.Join("_", flightGroups.Keys),
                String.Join("_", flightGroups.Values)
            }));

            Dictionary <int, List <FlightPlainInfo> > result;

            if ((result = CacheHelper.GetCacheItem <Dictionary <int, List <FlightPlainInfo> > >(hash)) != null)
            {
                return(result);
            }

            var charterDate = tourDate.AddDays(charterDay - 1).Date;

            // в случае, если перелета с ключом charterKey в БД нет, не найдутся ctKeyFrom и ctKeyTo
            // при этом мы возьмем данные, которые стоят в БД - cityKeyFrom и cityKeyTo
            int?ctKeyFrom, ctKeyTo;

            dc.GetCharterCityDirection(charterKey, out ctKeyFrom, out ctKeyTo);
            if (ctKeyFrom.HasValue)
            {
                cityKeyFrom = ctKeyFrom.Value;
            }
            if (ctKeyTo.HasValue)
            {
                cityKeyTo = ctKeyTo.Value;
            }

            result =
                findFlight
                    ? dc.GetAltCharters(mainDc, cityKeyFrom, cityKeyTo, charterDate, packetKey, flightGroups, out cacheDep)
                    : dc.GetAltCharters(mainDc, charterKey, charterDate, packetKey, flightGroups, out cacheDep);
            cacheDependencies.Add(cacheDep);

            foreach (var key in flightGroups.Keys)
            {
                foreach (var flight in result[key])
                {
                    if (dc.IsStopByDrection(cityKeyFrom, cityKeyTo, charterDate,
                                            linkedDay != null ? tourDate.AddDays(linkedDay.Value - 1) : charterDate, out cacheDep))
                    {
                        flight.QuotaState = new QuotaStatePlaces
                        {
                            QuotaState = QuotesStates.No
                        };
                    }
                    else
                    {
                        flight.QuotaState = dc.CheckServiceQuota(ServiceClass.Flight, flight.CharterKey, flight.ClassKey, null, flight.PartnerKey, agentKey, charterDate, linkedDay != null ? tourDate.AddDays(linkedDay.Value - 1) : charterDate, out cacheDep);
                    }
                    cacheDependencies.Add(cacheDep);

                    //if (flightInfo.QuotaState.QuotaState == QuotesStates.Undefined
                    //    || QuotasExtension.OrderderQuotaStates[tempState.QuotaState] > QuotasExtension.OrderderQuotaStates[flightInfo.QuotaState.QuotaState]
                    //    || (tempState.QuotaState == QuotesStates.Small && flightInfo.QuotaState.QuotaState == QuotesStates.Small && tempState.Places > flightInfo.QuotaState.Places))
                    //{
                    //    flightInfo.QuotaState = tempState;
                    //}

                    //if (flightInfo.QuotaState.QuotaState == QuotesStates.Availiable)
                    //    break;
                }
            }


            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Example #25
0
        /// <summary>
        /// Возвращает список пакетов, в которых лежат цены для бронирования авиабилетов
        /// </summary>
        /// <param name="dc">Контекст базы данных</param>
        /// <param name="searchDc">Контекст поисковой БД</param>
        /// <param name="hash">Хэш кэша</param>
        /// <returns>Tuple int, PacketType - ключ пакета, тип пакета (направление туда, обратно или туда/обратно)</returns>
        public static IList <Tuple <int, PacketType> > GetFlightPackets(this MtMainDbDataContext dc, MtSearchDbDataContext searchDc, out string hash)
        {
            List <Tuple <int, PacketType> > result;

            hash = String.Format("{0}", MethodBase.GetCurrentMethod().Name);
            if ((result = CacheHelper.GetCacheItem <List <Tuple <int, PacketType> > >(hash)) != null)
            {
                return(result);
            }

            var cacheDependencies = new List <string>();

            result = new List <Tuple <int, PacketType> >();

            string hashOut;
            var    packetKeys = dc.GetCharterBookingPackets(out hashOut);

            cacheDependencies.Add(hashOut);

            var packetKeysDates = dc.GetDatesByTours(packetKeys, out hashOut);

            cacheDependencies.Add(hashOut);

            var allPacketServices = dc.GetClassServicesByTurListKeys(ServiceClass.Flight, packetKeysDates.Select(p => p.Item1).Distinct().ToList(), out hashOut);

            cacheDependencies.Add(hashOut);

            var homeCountryKey = (from ct in searchDc.GetAllCities()
                                  where ct.CT_KEY == Globals.Settings.HomeCityKey
                                  select ct.CT_CNKEY)
                                 .Single();

            foreach (var packetKey in packetKeysDates.Select(p => p.Item1).Distinct().ToList())
            {
                var services = (from s in allPacketServices
                                where s.TS_PKKEY == packetKey
                                select s)
                               .ToList();

                if (services.Count > 1)
                {
                    result.Add(new Tuple <int, PacketType>(packetKey, PacketType.TwoWayCharters));
                }
                else if (services.Count == 1)
                {
                    var serviceCountryKey = (from cn in searchDc.GetAllCities()
                                             where cn.CT_KEY == services[0].TS_SUBCODE2
                                             select cn.CT_CNKEY)
                                            .FirstOrDefault();

                    result.Add(serviceCountryKey == homeCountryKey
                        ? new Tuple <int, PacketType>(packetKey, PacketType.DirectCharters)
                        : new Tuple <int, PacketType>(packetKey, PacketType.BackCharters));
                }
            }

            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Example #26
0
        /// <summary>
        /// Возвращает информацию по туру для корзины по ключу цены
        /// </summary>
        /// <param name="mainDc">Контекст основной БД</param>
        /// <param name="searchDc">Контекст поисковой БД</param>
        /// <param name="priceKey">Ключ цены (таблица tp_prices)</param>
        /// <returns></returns>
        public static PriceInfo GetPriceInfoByTPKey(this MtMainDbDataContext mainDc, MtSearchDbDataContext searchDc, int priceKey)
        {
            var priceStartDate = mainDc.GetTPPriceByKey(priceKey).TP_DateBegin;

            var commandBuilder = new StringBuilder();

            commandBuilder.AppendLine("select to_key, ts_key, ts_svkey, ts_code, ts_subcode1, ts_subcode2, ts_oppartnerkey, ts_oppacketkey, ts_day, ts_days, ts_men, ts_attribute ");
            commandBuilder.AppendLine("from tp_tours ");
            commandBuilder.AppendLine("join tp_services on ts_tokey = to_Key ");
            commandBuilder.AppendLine("join tp_servicelists on tl_tskey = ts_key ");
            commandBuilder.AppendLine("join tp_lists on ti_key = tl_tikey ");
            commandBuilder.AppendLine(String.Format("where tl_tikey in (select tp_tikey from tp_prices where tp_key = {0})", priceKey));
            commandBuilder.AppendLine("order by ts_day, ts_key");

            var priceInfo = new PriceInfo();

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

                mainDc.Connection.Open();
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        if (priceInfo.Tour == null)
                        {
                            priceInfo.Tour = (from tour in searchDc.GetAllTPTours()
                                              where tour.TO_Key == reader.GetInt32("to_key")
                                              select tour).Single();
                        }

                        var sf = new ServiceInfo
                        {
                            Key          = reader.GetInt32("ts_key"),
                            ServiceClass = (ServiceClass)reader.GetInt32("ts_svkey"),
                            Code         = reader.GetInt32("ts_code"),
                            SubCode1     = reader.GetInt32OrNull("ts_subcode1"),
                            SubCode2     = reader.GetInt32OrNull("ts_subcode2"),
                            PartnerKey   = reader.GetInt32("ts_oppartnerkey"),
                            PacketKey    = reader.GetInt32("ts_oppacketkey"),
                            StartDate    = priceStartDate.AddDays(reader.GetInt16("ts_day") - 1),
                            Days         = reader.GetInt16("ts_days"),
                            NMen         = reader.GetInt16("ts_men"),
                            Attribute    = reader.GetInt32("ts_attribute"),
                            Day          = reader.GetInt16("ts_day")
                        };

                        if (sf.ServiceClass != ServiceClass.Flight)
                        {
                            priceInfo.Services.Add(sf);
                        }
                        else
                        {
                            int?ctKeyFrom, ctKeyTo;
                            searchDc.GetCharterCityDirection(sf.Code, out ctKeyFrom, out ctKeyTo);

                            if (!ctKeyFrom.HasValue || !ctKeyTo.HasValue)
                            {
                                throw new KeyNotFoundException(String.Format("Перелет с ключом {0} не найден", sf.Code));
                            }

                            var    findFlight   = (sf.Attribute & (int)ServiceAttribute.CodeEdit) != (int)ServiceAttribute.CodeEdit;
                            var    flightGroups = Globals.Settings.CharterClassesDictionary;
                            string hashOut;
                            var    altCharters =
                                findFlight
                                ? searchDc.GetAltCharters(mainDc, ctKeyFrom.Value, ctKeyTo.Value, sf.StartDate, sf.PacketKey, flightGroups, out hashOut)
                                : searchDc.GetAltCharters(mainDc, sf.Code, sf.StartDate, sf.PacketKey, flightGroups, out hashOut);

                            foreach (var key in flightGroups.Keys)
                            {
                                var key1 = key;
                                priceInfo.Flights.AddRange(altCharters[key].Select(info => new FlightInfo()
                                {
                                    Key             = sf.Key,
                                    Attribute       = sf.Attribute,
                                    Code            = info.CharterKey,
                                    SubCode1        = info.ClassKey,
                                    PartnerKey      = info.PartnerKey,
                                    FlightTimeStart = info.FlightDateTimeFrom,
                                    FlightTimeEnd   = info.FlightDateTimeTo,
                                    Days            = sf.Days,
                                    Day             = sf.Day,
                                    ServiceClass    = sf.ServiceClass,
                                    SubCode2        = sf.SubCode2,
                                    PacketKey       = sf.PacketKey,
                                    StartDate       = sf.StartDate,
                                    NMen            = sf.NMen,
                                    FlightGroupKey  = key1
                                }));
                            }
                        }
                    }
                }
                mainDc.Connection.Close();
            }

            var priceEndDate = priceStartDate;
            var tempDate     = DateTime.MinValue;

            foreach (var sf in priceInfo.Services)
            {
                string hashOut;
                // делаем расчет стоимости услуги
                //todo: переделать получение цены по разным валютам
                sf.Cost = mainDc.GetServiceCost((int)sf.ServiceClass, sf.Code,
                                                sf.SubCode1.HasValue ? sf.SubCode1.Value : 0, sf.SubCode2.HasValue ? sf.SubCode2.Value : 0,
                                                sf.PartnerKey, sf.PacketKey, sf.StartDate, sf.Days, "E", sf.NMen, out hashOut);

                // получаем конечную дату тура
                if (sf.ServiceClass == ServiceClass.Hotel || sf.ServiceClass == ServiceClass.AddHotelService)
                {
                    tempDate = priceStartDate.AddDays(sf.Day + Math.Max((int)sf.Days, 1) - 1);
                }
                else
                {
                    tempDate = priceStartDate.AddDays(sf.Day + Math.Max((int)sf.Days, 1) - 2);
                }

                if (priceEndDate < tempDate)
                {
                    priceEndDate = tempDate;
                }
            }

            foreach (var fi in priceInfo.Flights)
            {
                string hashOut;
                // делаем расчет стоимости услуги
                //todo: переделать получение цены по разным валютам
                fi.Cost = mainDc.GetServiceCost((int)fi.ServiceClass, fi.Code,
                                                fi.SubCode1.HasValue ? fi.SubCode1.Value : 0, fi.SubCode2.HasValue ? fi.SubCode2.Value : 0,
                                                fi.PartnerKey, fi.PacketKey, fi.StartDate, priceInfo.Flights.Max(f => f.Day), "E", fi.NMen, out hashOut);

                // получаем направление перелета
                // первый перелет - прямой перелет
                // последний перелет - обратный
                // все остальные - промежуточные
                if (fi.Key == priceInfo.Flights.Min(f => f.Key))
                {
                    fi.Direction = FlightDirection.DirectFlight;
                }
                else if (fi.Key == priceInfo.Flights.Max(f => f.Key))
                {
                    fi.Direction = FlightDirection.BackFlight;
                }
                else
                {
                    fi.Direction = FlightDirection.Intermediate;
                }

                // получаем конечную дату тура
                tempDate = priceStartDate.AddDays(fi.Day - 1);
                if (priceEndDate < tempDate)
                {
                    priceEndDate = tempDate;
                }
            }
            priceInfo.TourDateBegin = priceStartDate;
            priceInfo.TourDateEnd   = tempDate;

            var tst = priceInfo.GetTourHotelsAndPansions;

            return(priceInfo);
        }
Example #27
0
        /// <summary>
        /// Данные по квотам на перелеты
        /// </summary>
        /// <param name="dc">Контекст БД</param>
        /// <param name="mainDc">Контекст БД</param>
        /// <param name="query">Параметры запроса</param>
        /// <param name="hash">Строка кэша</param>
        /// <returns></returns>
        public static QuotaPriceResult GetFlightQuotaPrices(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc, QuotaPriceQuery query, out string hash)
        {
            QuotaPriceResult result;

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

            // определяем агента по логину / паролю пользователя
            int?agentKey = null;

            if (!string.IsNullOrEmpty(query.UserName))
            {
                var user = mainDc.GetDupUser(query.UserName, query.UserPassword);
                if (user != null)
                {
                    agentKey = user.US_PRKEY;
                }
            }

            var cacheDependencies = new List <string>();

            result = new QuotaPriceResult();

            foreach (var flightPars in query.FlightParams)
            {
                string hashOut;
                var    cost = dc.GetFlightPriceByParams(flightPars.FlightParamKeys.CharterKey,
                                                        flightPars.FlightParamKeys.CharterClassKey, flightPars.FlightParamKeys.PartnerKey,
                                                        flightPars.FlightParamKeys.PacketKey, flightPars.DepartTime.Date,
                                                        flightPars.Duration != null
                                        ? flightPars.Duration.Value
                                        : 1,
                                                        out hashOut);
                if (!cacheDependencies.Contains(hashOut))
                {
                    cacheDependencies.Add(hashOut);
                }

                if (cost != null && cost.Price != null)
                {
                    var quotaState = dc.CheckServiceQuotaByDay(ServiceClass.Flight,
                                                               flightPars.FlightParamKeys.CharterKey,
                                                               flightPars.FlightParamKeys.CharterClassKey,
                                                               null,
                                                               flightPars.FlightParamKeys.PartnerKey,
                                                               agentKey,
                                                               flightPars.DepartTime.Date,
                                                               flightPars.Duration != null
                            ? flightPars.Duration.Value
                            : 1,
                                                               true,
                                                               out hashOut);

                    if (!cacheDependencies.Contains(hashOut))
                    {
                        cacheDependencies.Add(hashOut);
                    }

                    result.FlightData.Add(new QuotaPriceData
                    {
                        QuotaState  = quotaState.QuotaState,
                        QuotaPlaces = quotaState.Places,
                        PriceValue  = cost
                    });
                }
            }

            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Example #28
0
        /// <summary>
        /// Возвращает список городов прилета
        /// </summary>
        /// <param name="dc">Контекст поисковой БД</param>
        /// <param name="mainDc">Контекст основной БД</param>
        /// <param name="isOneWay">Является ли перелет в одну сторону или туда/обратно</param>
        /// <param name="countryKey">Ключ страны прилета</param>
        /// <param name="cityKeyFrom">Ключ города вылета</param>
        /// <param name="hash">Хэш кэша</param>
        /// <returns></returns>
        public static IList <Tuple <int, string> > GetFlightCitiesTo(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc, bool isOneWay, int?countryKey, int cityKeyFrom, out string hash)
        {
            List <Tuple <int, string> > result;

            hash = String.Format("{0}_{1}_{2}_{3}", MethodBase.GetCurrentMethod().Name, isOneWay, countryKey, cityKeyFrom);
            if ((result = CacheHelper.GetCacheItem <List <Tuple <int, string> > >(hash)) != null)
            {
                return(result);
            }

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

            var packets =
                mainDc.GetFlightPackets(dc, out hashOut)
                .Where(
                    p =>
                    !isOneWay && p.Item2 == PacketType.TwoWayCharters ||
                    isOneWay && p.Item2 != PacketType.TwoWayCharters)
                .ToList();

            cacheDependencies.Add(hashOut);

            var schedule = dc.GetFlightSchedules(mainDc, packets, out hashOut);

            cacheDependencies.Add(hashOut);

            var cities = new List <int>();

            if (isOneWay)
            {
                cities.AddRange(schedule.Schedule.Where(s => s.FlightParamsFrom == null && s.FlightParamsTo != null)
                                .Where(s => s.FlightParamsTo.CityKeyFrom == cityKeyFrom)
                                .Select(s => s.FlightParamsTo.CityKeyTo)
                                .Distinct()
                                .ToList());

                cities.AddRange(schedule.Schedule.Where(s => s.FlightParamsTo == null && s.FlightParamsFrom != null)
                                .Where(s => s.FlightParamsFrom.CityKeyFrom == cityKeyFrom)
                                .Select(s => s.FlightParamsFrom.CityKeyTo)
                                .Distinct()
                                .ToList());
            }
            else
            {
                cities.AddRange(schedule.Schedule.Where(s => s.FlightParamsFrom != null && s.FlightParamsTo != null)
                                .Where(s => s.FlightParamsFrom.CityKeyTo == cityKeyFrom && s.FlightParamsTo.CityKeyFrom == cityKeyFrom)
                                .Select(s => s.FlightParamsTo.CityKeyTo)
                                .Distinct()
                                .ToList());
            }

            result = (from c in dc.GetAllCities()
                      where cities.Contains(c.CT_KEY) &&
                      (countryKey == null || c.CT_CNKEY == countryKey.Value)
                      select new Tuple <int, string>(c.CT_KEY, c.CT_NAME))
                     .OrderBy(c => c.Item2)
                     .ToList();

            cacheDependencies.Add(CitiesExtension.TableName);

            CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout);
            return(result);
        }
Example #29
0
        /// <summary>
        /// Метод по выдаче расписаний рейсов
        /// </summary>
        /// <param name="dc">Контекст БД</param>
        /// <param name="mainDc">Контекст БД</param>
        /// <returns></returns>
        public static FlightSchedule GetFlightSchedules(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc)
        {
            string hash;

            return(GetFlightSchedules(dc, mainDc, out hash));
        }
Example #30
0
        public static IList <SearchResultItem> ConvertCalcTourToNoSql(this MtMainDbDataContext mainDc, MtSearchDbDataContext searchDc, int tourKey)
        {
            var     result = new List <SearchResultItem>();
            string  hashOut;
            var     tours = searchDc.GetTPToursByKeys(new[] { tourKey }, out hashOut);
            TP_Tour tpTour;

            if (tours != null && tours.Count == 1)
            {
                tpTour = tours[0];
            }
            else
            {
                throw new ArgumentException(String.Format("Неправильный параметр tourKey"));
            }

            var tourString = searchDc.GetTourStringsByKeys(new [] { tpTour.TO_Key }, out hashOut);
            var tpPrices   = mainDc.TP_Prices.Where(t => t.TP_TOKey == tourKey && t.TP_Gross != null).ToList();

            foreach (var tpPrice in tpPrices)
            {
                var item = new SearchResultItem();
                // будет заполнен при выдаче результата в поиск
                item.PriceInRates = null;
                item.PriceKey     = tpPrice.TP_Key;
                item.Price        = tpPrice.TP_Gross.Value;
                item.RateCode     = tpTour.TO_Rate;
                item.Date         = tpPrice.TP_DateBegin;
                item.PriceFor     = tpTour.TO_PriceFor == 0 ? PriceForType.PerMen : PriceForType.PerRoom;
                item.CountryKey   = tpTour.TO_CNKey;
            }
            return(result);
        }