예제 #1
0
        public async Task <dto.TripAvailabilityResponse> FindFlights(dto.TripAvailabilityRequest request)
        {
            var signature = !string.IsNullOrEmpty(await _sessionBag.Signature())
                    ? await _sessionBag.Signature()
                    : await _userSessionService.GetAnonymousSharedSignature();

            var tripAvailabilityRequest = Mapper.Map <TripAvailabilityRequest>(request, m => m.AfterMap(SetFareTypes));
            var stopWatch = _perfLogSettings.EnableNavApiLogging ? Stopwatch.StartNew() : null;
            var response  = await _client.GetAvailabilityVer2Async(new GetAvailabilityRequest
            {
                ContractVersion        = _navApiContractVer,
                MessageContractVersion = _navMsgContractVer,
                Signature = signature,
                EnableExceptionStackTrace = false,
                TripAvailabilityRequest   = tripAvailabilityRequest
            });

            //_navApiContractVer, false,
            //_navMsgContractVer, signature, tripAvailabilityRequest);
            if (_perfLogSettings.EnableNavApiLogging && stopWatch != null)
            {
                stopWatch.Stop();
                var msecs = stopWatch.ElapsedMilliseconds;
                _logger.WriteTimedLog(msecs, "BookingManager.GetAvailabilityVer2Async" + "|" + signature);
            }
            var avRequestWithInfant = Array.Find(request.AvailabilityRequests, p => Array.Find(
                                                     p.PaxTypeCounts, q => q.PaxTypeCode == Global.INFANT_CODE && q.PaxCount > 0) != null);

            if (avRequestWithInfant != null)
            {
                var infantCount = Array.Find(avRequestWithInfant.PaxTypeCounts,
                                             q => q.PaxTypeCode == Global.INFANT_CODE).PaxCount;
                foreach (var schedule in response.GetTripAvailabilityVer2Response.Schedules)
                {
                    foreach (var market in schedule)
                    {
                        foreach (var journey in market.AvailableJourneys)
                        {
                            var clearFares = false;
                            foreach (var segment in journey.AvailableSegment)
                            {
                                foreach (var leg in segment.Legs)
                                {
                                    var legSSRInsufficient = Array.Find(leg.LegInfo.LegSSRs, p => p.SSRNestCode == Global.INFANT_CODE &&
                                                                        p.SSRLid - p.SSRSold < infantCount);
                                    if (legSSRInsufficient != null)
                                    {
                                        clearFares = true;
                                        continue;
                                    }
                                }
                                if (clearFares)
                                {
                                    continue;
                                }
                            }
                            if (clearFares)
                            {
                                foreach (var segment in journey.AvailableSegment)
                                {
                                    segment.AvailableFares = new AvailableFare2[0];
                                }
                            }
                        }
                    }
                }
            }
            var convertedResponse =
                Mapper.Map <dto.TripAvailabilityResponse>(response.GetTripAvailabilityVer2Response);

            return(convertedResponse);
        }