/// <summary> /// /// </summary> private void VerifyRequest() { Segment segment = new Segment(); DateTime arrivalDT = new DateTime(); int routeIndex = 0, segmentIndex = 0, legIndex = 0; if (Request.Form["r2r_resp"] != null) { segment = JsonConvert.DeserializeObject<Segment>(Request.Form["r2r_resp"]);//JsonConvert.DeserializeObject<Segment>(GetMockJson()); } if (Request.Form["arrdate"] != null) { arrivalDT = DateTime.ParseExact(Request.Form["arrdate"], "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture); } if (Request.Form["segmentIndex"] != null) { segmentIndex = int.Parse(Request.Form["segmentIndex"]); } if (Request.Form["routeIndex"] != null) { routeIndex = int.Parse(Request.Form["routeIndex"]); } if (Request.Form["legIndex"] != null) { legIndex = int.Parse(Request.Form["legIndex"]); } RequestData rd = new RequestData(); rd.nextArrDate = arrivalDT.ToString("yyyy-MM-dd HH:mm"); rd.segment = segment; rd.segmentIndex = segmentIndex; rd.routeIndex = routeIndex; rd.legIndex = legIndex; litJsonRq.Text = JsonConvert.SerializeObject(rd); }
/// <summary> /// Gets the weekly frequency (in minutes) of the segment. <see cref="CalcFrequency"/> /// </summary> /// <param name="segment"> /// Door2DoorCore.Types.Door2DoorResponse.Segment. /// </param> /// <returns> /// int WeeklyFrequency /// </returns> private int GetWeeklyFrequency(Segment segment) { int weeklyFrequency = 0; if (segment.Itineraries != null && segment.Kind != "flight") { if (segment.Itineraries[0].Legs != null && segment.Itineraries[0].Legs.Length > 0) { if (segment.Itineraries[0].Legs[0].Hops != null) { weeklyFrequency = segment.Itineraries[0].Legs[0].Hops.Sum(e => e.Frequency); } } } return weeklyFrequency; }
/// <summary> /// Gets the total frequency (in minutes) of the segment /// </summary> /// <param name="segment"> /// Door2DoorCore.Types.Door2DoorResponse.Segment. /// </param> /// <returns> /// Nullable TimeSpan indicating the total frequency. ('null' if the segment does not have a frequency attribute) /// </returns> private TimeSpan? GetSegmentFrequency(Segment segment) { TimeSpan? freq = null; int horasTotal = 0; if (segment != null && segment.Itineraries != null && segment.Kind != "flight") for (int i = 0; i < segment.Itineraries.Length; i++) if (segment.Itineraries[i].Legs != null) for (int j = 0; j < segment.Itineraries[i].Legs.Length; j++) if (segment.Itineraries[i].Legs[j].Hops != null) horasTotal += segment.Itineraries[i].Legs[j].Hops.Sum(e => e.Frequency); if (horasTotal > 0) freq = CalcFrequency(horasTotal); return freq; }
/// <summary> /// Finds the Itinerary that arrives at the latest time. /// </summary> /// <param name="segment"> /// The current <see cref="Door2DoorCore.Types.Door2DoorResponse.Segment"/>. /// </param> /// <returns> /// Leg (Itinerary) /// </returns> private Leg FindLatestItinerary(ref Segment segment) { Leg latestItinerary = null; for (int i = 0; i < segment.Itineraries.Length; i++) { Leg itinerary = segment.Itineraries[i].Legs[0]; segment.Itineraries[i].ValidForSchedule = true; //hora de chegada do ultimo voo da opcao atual string[] tTime = itinerary.Hops[itinerary.Hops.Length - 1].TTime.Split(':'); // horario do itinerario atual TimeSpan itineraryDate = new TimeSpan(int.Parse(tTime[0]), int.Parse(tTime[1]), 0); if (latestItinerary == null)// é o primeiro { latestItinerary = itinerary; segment.ChosenItinerary = i; } else { string[] latestItineraryTime = latestItinerary.Hops[latestItinerary.Hops.Length - 1].TTime.Split(':'); TimeSpan latestItineraryDate = new TimeSpan(int.Parse(latestItineraryTime[0]), int.Parse(latestItineraryTime[1]), 0); if (latestItineraryDate < itineraryDate)// achou uma opcao mais tarde { latestItinerary = itinerary; segment.ChosenItinerary = i; } } } return latestItinerary; }
/// <summary> /// Builds a Itinerary <see cref="Door2DoorCore.Types.Door2DoorResponse.Itinerary"/> based on the D2DRequestChosenRoute on the request. /// </summary> /// <param name="segment"> /// Which segment the itinerary will be included /// </param> /// <param name="legIndex"> /// Whether this is the inbound(0) or outbound(1) leg of the trip /// </param> private void BuildINewtinFromChosenRoute(ref Segment segment, int legIndex) { Itinerary it = new Itinerary(); it.Legs = new Leg[1]; it.OuterItinerary = true; it.ValidForSchedule = true; it.Legs[0] = new Leg(); it.Legs[0].Hops = new Hop[_req.chosenRoute[legIndex].flightSegment.flightLegs.Length]; it.Legs[0].IndicativePrice = new IndicativePrice4(); it.Legs[0].IndicativePrice.Price = _req.chosenRoute[legIndex].price; it.Legs[0].IndicativePrice.Currency = _req.chosenRoute[legIndex].currency; int duration = 0; for (int i = 0; i < _req.chosenRoute[legIndex].flightSegment.flightLegs.Length; i++) { Hop hop = new Hop(); hop.SCode = _req.chosenRoute[legIndex].flightSegment.flightLegs[i].origin; hop.TCode = _req.chosenRoute[legIndex].flightSegment.flightLegs[i].destination; hop.STime = _req.chosenRoute[legIndex].flightSegment.flightLegs[i].departureDate.ToString("HH:mm"); hop.TTime = _req.chosenRoute[legIndex].flightSegment.flightLegs[i].arrivalDate.ToString("HH:mm"); hop.Flight = _req.chosenRoute[legIndex].flightSegment.flightLegs[i].number; hop.Airline = _req.chosenRoute[legIndex].flightSegment.flightLegs[i].marketingAirline; hop.Duration = _req.chosenRoute[legIndex].flightSegment.flightLegs[i].duration; hop.DayChange = (_req.chosenRoute[legIndex].flightSegment.flightLegs[i].arrivalDate - _req.chosenRoute[legIndex].flightSegment.flightLegs[i].departureDate).Days; duration += _req.chosenRoute[legIndex].flightSegment.flightLegs[i].duration; it.Legs[0].Hops[i] = hop; } segment.Duration = duration; Itinerary[] its = segment.Itineraries; Array.Resize(ref its, segment.Itineraries.Length + 1); segment.Itineraries = its; segment.Itineraries[segment.Itineraries.Length - 1] = it; segment.ChosenItinerary = segment.Itineraries.Length - 1; }
/// <summary> /// <para>Sometimes Rome2Rio API calculates lonk walking segments.</para> /// <para>When a situation like this is identified, the 'walk' segment is transformed into a 'taxi' segment.</para> /// <para>This is intended to be transitory, as they stated that this behavior will be fixed, but we never know.</para> /// <para><seealso cref="Door2DoorCore.Door2DoorBase._maxWalkingMinutes"/></para> /// </summary> /// <param name="segment"> /// Segment to be transformed /// </param> private void WalkIntoTaxiTransformation(ref Segment segment) { segment.Kind = "car"; segment.Vehicle = "taxi"; if (segment.IndicativePrice == null) { segment.IndicativePrice = new IndicativePrice2(); } segment.IndicativePrice.Currency = "BRL"; // cada minuto andando corresponde à R$0,371428571428 de taxi(abstraia, abstraia) segment.IndicativePrice.Price = Math.Round(segment.Duration * 0.371428571428M, 0); // cada minuto andando equivale(abstraia, veja bem) à 0.142857142857 minutos em um taxi segment.Duration = Convert.ToInt32(Math.Ceiling(decimal.Parse(segment.Duration.ToString()) * 0.142857142857M)); }