private string GetDepartureAirport(PNR_Reply pnr, string pnrNumber)
        {
            if (pnr == null)
            {
                return AIRPORT_IS_MISSING;
            }

            if (pnr.originDestinationDetails == null)
            {
                return AIRPORT_IS_MISSING;
            }

            if (pnr.originDestinationDetails.Count() == 1)
            {
                var originDestinationDetail = pnr.originDestinationDetails.First();
                if (originDestinationDetail.itineraryInfo == null)
                {
                    return AIRPORT_IS_MISSING;
                }
                
                if (originDestinationDetail.itineraryInfo.Count() > 0)
                {
                    var itineraryInfo = originDestinationDetail.itineraryInfo.First();
                    var elementManagementItineraryLineNumber = ConvertToIntWithError(itineraryInfo.elementManagementItinerary.lineNumber, pnrNumber);
                    foreach (var ii in originDestinationDetail.itineraryInfo)
                    {
                        if (ii.elementManagementItinerary != null)
                        {
                            var elementManagementItineraryLineNumber2 = ConvertToIntWithError(ii.elementManagementItinerary.lineNumber, pnrNumber);
                            if (ii.elementManagementItinerary.segmentName.ToUpper().Trim() == ELEMENT_MANAGEMENT_ITINERARY_SEGMENT_NAME_AIR
                                && elementManagementItineraryLineNumber2 < elementManagementItineraryLineNumber)
                            {
                                itineraryInfo = ii;
                                elementManagementItineraryLineNumber = elementManagementItineraryLineNumber2;
                            }
                        }
                    }


                    var travelProduct = itineraryInfo.travelProduct;
                    if (travelProduct == null)
                    {
                        return AIRPORT_IS_MISSING;
                    }

                    var boardpointDetail = travelProduct.boardpointDetail;
                    if (boardpointDetail == null)
                    {
                        return AIRPORT_IS_MISSING;
                    }

                    var cityCode = boardpointDetail.cityCode;
                    if (cityCode.Length == 3)
                    {
                        return cityCode;
                    }
                    else
                    {
                        throw new Exception(string.Format("Unexpected Error. DepartureCode is too long or short . PNR:{0}", pnrNumber));
                    }
                }

                throw new Exception(string.Format("Unexpected Error. No ItineraryInfo found for. PNR:{0}", pnrNumber));
            }

            throw new Exception(string.Format("Unexpected Error. Too many originDestinationDetails were found. PNR:{0}", pnrNumber));
        }
        private string GetArrivalAirport(PNR_Reply pnr, string pnrNumber)
        {
            if (pnr == null)
            {
                return AIRPORT_IS_MISSING;
            }

            if (pnr.originDestinationDetails == null)
            {
                return AIRPORT_IS_MISSING;
            }

            if (pnr.originDestinationDetails.Count() == 1)
            {
                var originDestinationDetail = pnr.originDestinationDetails.First();
                if (originDestinationDetail.itineraryInfo == null)
                {
                    return AIRPORT_IS_MISSING;
                }

                if (originDestinationDetail.itineraryInfo.Count() > 0)
                {
                    return GetDestinationAirport(originDestinationDetail.itineraryInfo, pnrNumber);
                }

                throw new Exception(string.Format("Unexpected Error. No ItineraryInfo found for. PNR:{0}", pnrNumber));
            }

            throw new Exception(string.Format("Unexpected Error. Too many originDestinationDetails were found. PNR:{0}", pnrNumber));
        }
        private DateTime GetDepartureDate(PNR_Reply pnr, string pnrNumber)
        {
            if (pnr == null)
            {
                return DEPARTURE_DATE_IS_MISSING;
            }

            if (pnr.originDestinationDetails == null)
            {
                return DEPARTURE_DATE_IS_MISSING;
            }

            if (pnr.originDestinationDetails.Count() == 1)
            {
                var originDestinationDetail = pnr.originDestinationDetails.First();
                if (originDestinationDetail.itineraryInfo == null)
                {
                    return DEPARTURE_DATE_IS_MISSING;
                }
                

                if (originDestinationDetail.itineraryInfo.Count() > 0)
                {
                    var itineraryInfo = originDestinationDetail.itineraryInfo.First();
                    var elementManagementItineraryLineNumber = ConvertToIntWithError(itineraryInfo.elementManagementItinerary.lineNumber, pnrNumber);
                    foreach (var ii in originDestinationDetail.itineraryInfo)
                    {
                        if (ii.elementManagementItinerary != null)
                        {
                            var elementManagementItineraryLineNumber2 = ConvertToIntWithError(ii.elementManagementItinerary.lineNumber, pnrNumber);
                            if (ii.elementManagementItinerary.segmentName.ToUpper().Trim() == ELEMENT_MANAGEMENT_ITINERARY_SEGMENT_NAME_AIR
                                && elementManagementItineraryLineNumber2 < elementManagementItineraryLineNumber)
                            {
                                itineraryInfo = ii;
                                elementManagementItineraryLineNumber = elementManagementItineraryLineNumber2;
                            }
                        }
                    }

                    var travelProduct = itineraryInfo.travelProduct;
                    if (travelProduct == null)
                    {
                        return DEPARTURE_DATE_IS_MISSING;
                    }

                    var product = travelProduct.product;
                    if (product == null)
                    {
                        return DEPARTURE_DATE_IS_MISSING;
                    }

                    var depDate = product.depDate;
                    try
                    {
                        return DateTime.ParseExact(depDate, "ddMMyy", CultureInfo.InvariantCulture);
                    }
                    catch
                    {
                        throw new Exception(string.Format("Unexpected Error. Failed converting depDate. PNR:{0}", pnrNumber));
                    }
                }

                throw new Exception(string.Format("Unexpected Error. No ItineraryInfo found for. PNR:{0}", pnrNumber));
            }

            throw new Exception(string.Format("Unexpected Error. Too many originDestinationDetails were found. PNR:{0}", pnrNumber));
        }