/// <summary> /// Runs the activity asynchronously. /// </summary> /// <param name="sharedContext">The shared context.</param> /// <returns> /// Next activity to be run or <c>null</c> if last in flow. /// </returns> public async Task <IActivity> RunAsync(SharedContext sharedContext) { IBargainFinderMaxData data = sharedContext.GetResult <IBargainFinderMaxData>(InputDataSharedContextKey); if (data == null) { throw new ArgumentException("No data found under key: " + InputDataSharedContextKey); } var security = await this.sessionPool.TakeSessionAsync(sharedContext.ConversationId); var service = this.soapServiceFactory.CreateBargainFinderMaxService(sharedContext.ConversationId, security); var request = this.CreateRequest(data); sharedContext.AddSerializedResultXML(RequestXmlSharedContextKey, request); try { var result = service.BargainFinderMaxRQ(request); sharedContext.AddSerializedResultXML(ResponseXmlSharedContextKey, result); EnhancedAirBookData enhancedAirBookData = this.CreateEnhancedAirBookData(result); sharedContext.AddResult(EnhancedAirBookActivity.InputDataSharedContextKey, enhancedAirBookData); return(new PassengerDetailsContactActivity(this.soapServiceFactory, this.sessionPool)); } catch (Exception ex) { sharedContext.AddResult(CommonConstants.ExceptionSharedContextKey, ex); sharedContext.IsFaulty = true; this.sessionPool.ReleaseSession(sharedContext.ConversationId); return(null); } }
/// <summary> /// Creates the input data for <see cref="EnhancedAirBookActivity"/>. /// </summary> /// <param name="result">The BargainFinderMax result.</param> /// <returns>The data.</returns> private EnhancedAirBookData CreateEnhancedAirBookData(OTA_AirLowFareSearchRS result) { OTA_AirLowFareSearchRSPricedItineraries itineraries = result.Items.OfType <OTA_AirLowFareSearchRSPricedItineraries>().First(); EnhancedAirBookData enhancedAirBookData = new EnhancedAirBookData(); enhancedAirBookData.FlightSegments = itineraries.PricedItinerary.First().AirItinerary.OriginDestinationOptions.First().FlightSegment .Select(flightSegment => new FlightSegmentData { DepartureDateTime = DateTime.ParseExact(flightSegment.DepartureDateTime, "s", CultureInfo.InvariantCulture), DestinationLocationCode = flightSegment.ArrivalAirport.LocationCode, FlightNumber = flightSegment.FlightNumber, MarketingAirlineCode = flightSegment.MarketingAirline.Code, OriginLocationCode = flightSegment.DepartureAirport.LocationCode, DesignationCode = flightSegment.ResBookDesigCode }); return(enhancedAirBookData); }