Example #1
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);
        }