2
2
PNRRetrieveRS
ConverResult(PNR_Reply pnrReply, OTA.Generic.Entity.Tracks tracks, bool
getTicketDetails, out string bkgSineIn, out List<string> emdNumbers,
Generic.Entity.Profiles.Profile profile)
{
OTA.Generic.Entity.PNRRetrieve.PNRRetrieveRS pnrResult = new
OTA.Generic.Entity.PNRRetrieve.PNRRetrieveRS();
bkgSineIn = string.Empty;
emdNumbers = new List<string>();
getTicketDetails = false;
try
{
var pnrErrorResult =
OTA.Amadeus.PNR.V21_1.Convert.ConverGeneralErrorResult(pnrReply, tracks);
pnrResult.status = 0;
pnrResult.msg = "success";
pnrResult.GDS_Type = profile.ConnectionProfile.GdsType;
if (!pnrErrorResult.isSuccess())
{
pnrResult.setError(pnrErrorResult.msg,
pnrErrorResult.errorCode);
//return pnrResult;
}
pnrResult.Passengers = new List<Passenger>();
pnrResult.Segments = new List<Segment>();
pnrResult.Remarks = new List<Remark>();
pnrResult.TicketTimeLimits = new List<string>();
pnrResult.SSRList = new List<SSR>();
List<OTA.Generic.Entity.Extension> extensions = new
List<Generic.Entity.Extension>();
List<DateTime> tktDeadlines = new List<DateTime>();
if (pnrReply != null)
{
pnrResult.sourceSystemRef = string.Empty;
if (pnrReply.pnrHeader != null && pnrReply.pnrHeader.Length > 0
&& pnrReply.pnrHeader[0].reservationInfo != null &&
pnrReply.pnrHeader[0].reservationInfo.Length > 0)
{
pnrResult.RLOC =
pnrReply.pnrHeader[0].reservationInfo[0].controlNumber;
}
tktDeadlines.Add(DateTime.ParseExact(dataEle.optionElement.optionElementInfo.date,
"ddMMyy", System.Globalization.DateTimeFormatInfo.InvariantInfo));
}
}
}
#region pax
int maxPaxnumExcludeInf = 0;
if (pnrReply.travellerInfo != null &&
pnrReply.travellerInfo.Length > 0)
{
List<Passenger> infPaxs = new List<Passenger>();
foreach (PNR_ReplyTravellerInfo paxInfo in
pnrReply.travellerInfo)
{
if (paxInfo == null || paxInfo.passengerData == null ||
paxInfo.passengerData.Length <= 0
|| paxInfo.passengerData[0].travellerInformation ==
null
||
paxInfo.passengerData[0].travellerInformation.passenger == null
||
paxInfo.passengerData[0].travellerInformation.passenger.Length <= 0)
{
//passenger 或者 traveller
continue;
}
foreach (PNR_ReplyTravellerInfoPassengerData paxData in
paxInfo.passengerData)
{
foreach (var p in
paxData.travellerInformation.passenger)
{
Passenger pax = new Passenger();
var dateOfBirth = DateTime.MinValue;
if (paxData.dateOfBirth != null &&
paxData.dateOfBirth.dateAndTimeDetails != null)
{
dateOfBirth =
DateTime.ParseExact(paxData.dateOfBirth.dateAndTimeDetails.date, "ddMMyyyy",
System.Globalization.DateTimeFormatInfo.InvariantInfo);
pax.birthday =
dateOfBirth.ToString("yyyyMMdd");
}
string surname = "";
if (paxData.travellerInformation.traveller !=
null)
{
surname =
paxData.travellerInformation.traveller.surname;
}
pax.name = !string.IsNullOrEmpty(surname) ?
string.Concat(surname, "/", p.firstName) : p.firstName;
pax.givenName = p.firstName;
pax.surname = surname;
pax.ageTypeCode = p.type;
if (!string.IsNullOrEmpty(p.type))
{
OTA.Generic.Definition.PaxType paxType =
OTA.Amadeus.Function.Util.GetPaxType(p.type);
switch (paxType)
{
case Generic.Definition.PaxType.CHD:
pax.ageType =
Generic.Definition.AgeType.Child;
break;
case Generic.Definition.PaxType.INF:
pax.ageType =
Generic.Definition.AgeType.Infant;
break;
case Generic.Definition.PaxType.ADT:
default:
pax.ageType =
Generic.Definition.AgeType.Adult;
break;
}
/*if (p.type ==
Generic.Utility.Passenger.GetPaxMappingCode(profile,
Generic.Definition.PaxType.ADT, "ADT"))
{
pax.ageType =
OTA.Generic.Definition.AgeType.Adult;
}
else if (p.type.IndexOf("C") != -1
|| p.type ==
Generic.Utility.Passenger.GetPaxMappingCode(profile,
Generic.Definition.PaxType.CHD, string.Empty)
|| p.type ==
Generic.Utility.Passenger.GetPaxMappingCode(profile,
Generic.Definition.PaxType.CNN, string.Empty))
{
pax.ageType =
OTA.Generic.Definition.AgeType.Child;
}
else if (p.type ==
Generic.Utility.Passenger.GetPaxMappingCode(profile,
Generic.Definition.PaxType.INF, "INF"))
{
pax.ageType =
OTA.Generic.Definition.AgeType.Infant;
}
else
{
pax.ageType =
OTA.Generic.Definition.AgeType.Adult;
}*/
}
else
{
pax.ageType =
Generic.Definition.AgeType.Adult;
}
if (pax.ageType !=
OTA.Generic.Definition.AgeType.Infant) pax.number =
paxInfo.elementManagementPassenger.reference.number;
else infPaxs.Add(pax);
int paxnum =
GetTogether.Utility.NumberHelper.ToInt(pax.number, 0);
if (paxnum > maxPaxnumExcludeInf)
maxPaxnumExcludeInf = paxnum;
pnrResult.Passengers.Add(pax);
}
}
}
if (infPaxs.Count > 0)
{
for (int i = 0; i < infPaxs.Count; i++)
{
infPaxs[i].number = (maxPaxnumExcludeInf + i +
1).ToString();
}
}
}
#endregion
Dictionary<int, OTA.Generic.Entity.Segment> ticketSegmentDict =
new Dictionary<int, Generic.Entity.Segment>();
#region segment
if (pnrReply.originDestinationDetails != null &&
pnrReply.originDestinationDetails.Length > 0 &&
pnrReply.originDestinationDetails[0].itineraryInfo != null &&
pnrReply.originDestinationDetails[0].itineraryInfo.Length > 0)
{
#region air segment
foreach (PNR_ReplyOriginDestinationDetailsItineraryInfo
itinerary in pnrReply.originDestinationDetails[0].itineraryInfo)
{
if (itinerary.travelProduct == null
|| itinerary.travelProduct.product == null
|| itinerary.travelProduct.product.arrDate == null
|| itinerary.travelProduct.product.arrTime == null
|| itinerary.travelProduct.product.depDate == null
|| itinerary.travelProduct.product.depTime == null
|| itinerary.travelProduct.productDetails == null
|| itinerary.elementManagementItinerary == null
||
itinerary.elementManagementItinerary.segmentName !=
OTA.Amadeus.Definition.PNR_Reply.SegmentName.AirSegment)
{
continue;
}
Generic.Entity.PNRRetrieve.Segment segment = new
Generic.Entity.PNRRetrieve.Segment();
if (itinerary.itineraryReservationInfo != null)
{
segment.marketingCarrier =
itinerary.itineraryReservationInfo.reservation.companyId;
//segment.operatingCarrier =
itinerary.itineraryReservationInfo.reservation.companyId;
pnrResult.airlineRloc =
itinerary.itineraryReservationInfo.reservation.controlNumber;
}
else if (itinerary.travelProduct.companyDetail != null)
{
segment.marketingCarrier =
itinerary.travelProduct.companyDetail.identification;
//segment.operatingCarrier =
itinerary.travelProduct.companyDetail.identification;
}
segment.arrTime =
DateTime.ParseExact(itinerary.travelProduct.product.arrDate +
itinerary.travelProduct.product.arrTime, "ddMMyyHHmm",
System.Globalization.DateTimeFormatInfo.InvariantInfo).ToString("yyyy-MM-
ddTHH:mm:ss");
segment.bookingClass =
itinerary.travelProduct.productDetails.classOfService;
if (itinerary.cabinDetails != null &&
itinerary.cabinDetails.cabinDetails != null && !
string.IsNullOrEmpty(itinerary.cabinDetails.cabinDetails.classDesignator))
{
//TODO not return fareclass
segment.fareClass =
OTA.Amadeus.Search.V21_4.BoardSearch.ConvertSupplierFareClass(itinerary.cabinDetail
s.cabinDetails.classDesignator);
}
segment.flightNumber =
itinerary.travelProduct.productDetails.identification;
segment.depTime =
DateTime.ParseExact(itinerary.travelProduct.product.depDate +
itinerary.travelProduct.product.depTime, "ddMMyyHHmm",
System.Globalization.DateTimeFormatInfo.InvariantInfo).ToString("yyyy-MM-
ddTHH:mm:ss");
segment.arrAirport =
itinerary.travelProduct.offpointDetail.cityCode;
if (itinerary.flightDetail != null &&
itinerary.flightDetail.arrivalStationInfo != null)
{
segment.arrTerminalId =
itinerary.flightDetail.arrivalStationInfo.terminal;
}
segment.depAirport =
itinerary.travelProduct.boardpointDetail.cityCode;
if (itinerary.flightDetail != null &&
itinerary.flightDetail.departureInformation != null)
{
segment.depTerminalId =
itinerary.flightDetail.departureInformation.departTerminal;
}
//segment.Segnum =
GetTogether.Utility.NumberHelper.ToInt(itinerary.elementManagementItinerary.referen
ce.number, 0);
// segment.RPH = segment.Segnum.ToString();
if (itinerary.relatedProduct != null &&
itinerary.relatedProduct.status != null && itinerary.relatedProduct.status.Length >
0)
{
segment.actionCode =
itinerary.relatedProduct.status[0];
}
segment.sourceReference =
itinerary.elementManagementItinerary.reference.number;//选 Seat
//if (!
string.IsNullOrEmpty(Config.Original.AmadeusGdsFareAirlines))
//{
// segment.IsGdsFare =
Config.Original.AmadeusGdsFareAirlines.IndexOf(segment.Airline) >= 0;
//}
if (itinerary.itineraryfreeFormText != null &&
itinerary.itineraryfreeFormText.Length > 0)
{
foreach (var fft in
itinerary.itineraryfreeFormText)
{
string operatedBy =
fft.freeText.FirstOrDefault(x => x.IndexOf("OPERATED BY") > -1);
if (!string.IsNullOrEmpty(operatedBy))
{
string r = operatedBy.Replace("OPERATED
BY", "").Trim();
segment.operatingCarrierName = r;
break;
}
}
if (pnrReply.dataElementsMaster != null &&
pnrReply.dataElementsMaster.dataElementsIndiv != null &&
pnrReply.dataElementsMaster.dataElementsIndiv.Length > 0)
{
foreach
(PNR_ReplyDataElementsMasterDataElementsIndiv item in
pnrReply.dataElementsMaster.dataElementsIndiv)
{
if (item != null &&
item.miscellaneousRemarks != null && item.miscellaneousRemarks.remarks != null && !
string.IsNullOrEmpty(item.miscellaneousRemarks.remarks.freetext))
{
//- VALID ON CX/KA ONLY
string pattern = "VALID ON (?
<Carriers>[A-Z/]{0,10})[ ]";
Regex regexPattern = new Regex(pattern,
RegexOptions.None | RegexOptions.IgnoreCase);
var match =
regexPattern.Match(item.miscellaneousRemarks.remarks.freetext);
if (match != null)
{
var carriers =
match.Groups["Carriers"].Value;
if (!
string.IsNullOrEmpty(carriers))
{
var carriersArr =
carriers.Split('/');
if (carriersArr.Length > 1 &&
segment.marketingCarrier == carriersArr[0])
{
segment.operatingCarrier =
carriersArr[1];
break;
}
}
}
}
}
}
}
int rph = 0;
if (itinerary.elementManagementItinerary != null
&& itinerary.elementManagementItinerary.reference !
= null
&&
itinerary.elementManagementItinerary.reference.qualifier == "ST"
&& !
string.IsNullOrEmpty(itinerary.elementManagementItinerary.reference.number))
{
rph =
GetTogether.Utility.NumberHelper.ToInt(itinerary.elementManagementItinerary.referen
ce.number, 0);
}
segment.rph = rph.ToString();
pnrResult.Segments.Add(segment);
if (getTicketDetails)
{
if (!ticketSegmentDict.ContainsKey(rph))
{
ticketSegmentDict.Add(rph, segment);
}
}
}
#endregion
OTA.Amadeus.Definition.PNR_Reply.SegmentName.Non_automatedHotelAuxiliarySegment,
OTA.Amadeus.Definition.PNR_Reply.SegmentName.AutomatedHotelAuxiliarySegment
}.Contains(itinerary.elementManagementItinerary.seg
mentName))
{
continue;
}
var hotelSegment = new HotelSegment();
hotelSegment.rate = new HotelSegment.Rate();
var hotelProduct = itinerary.hotelProduct;
var hotelReservationInfo =
itinerary.hotelReservationInfo; //有先以此信息为准,否则 hotelProduct
var travelProduct = itinerary.travelProduct;
#region hotelSegment
//segmentNo
if (itinerary.elementManagementItinerary.reference !=
null)
{
hotelSegment.segmentNo =
itinerary.elementManagementItinerary.reference.number;
}
if ((hotelSegment.requestorIATACode == null ||
hotelSegment.requestorIATACode.Length == 0) && pnrReply.securityInformation != null
&& pnrReply.securityInformation.secondRpInformation != null && !
string.IsNullOrEmpty(pnrReply.securityInformation.secondRpInformation.creatorIataCo
de))
{
string requestorIATACode =
pnrReply.securityInformation.secondRpInformation.creatorIataCode;
hotelSegment.requestorIATACode = new string[1]
{ requestorIATACode };
}
//status
if (itinerary.relatedProduct != null &&
itinerary.relatedProduct.status != null && itinerary.relatedProduct.status.Length >
0)
{
hotelSegment.status =
itinerary.relatedProduct.status[0];
}
if (!
string.IsNullOrEmpty(travelProduct.product.depDate))
{
fromDate =
DateTime.ParseExact(travelProduct.product.depDate, "ddMMyy",
System.Globalization.DateTimeFormatInfo.InvariantInfo);
hotelSegment.timeSpan.startDate =
DateTime.ParseExact(travelProduct.product.depDate, "ddMMyy",
System.Globalization.DateTimeFormatInfo.InvariantInfo).ToString("yyyyMMdd");
}
if (!
string.IsNullOrEmpty(travelProduct.product.arrDate))
{
toDate =
DateTime.ParseExact(travelProduct.product.arrDate, "ddMMyy",
System.Globalization.DateTimeFormatInfo.InvariantInfo);
hotelSegment.timeSpan.endDate =
DateTime.ParseExact(travelProduct.product.arrDate, "ddMMyy",
System.Globalization.DateTimeFormatInfo.InvariantInfo).ToString("yyyyMMdd");
}
}
if (fromDate != DateTime.MinValue && toDate ==
DateTime.MinValue)
{
if (itinerary.generalOption != null &&
itinerary.generalOption.Length > 0)
{
#endregion
#region rate
if (hotelReservationInfo != null &&
hotelReservationInfo.roomRateDetails != null)
{
if
(hotelReservationInfo.roomRateDetails.roomInformation != null &&
hotelReservationInfo.roomRateDetails.roomInformation.roomRateIdentifier != null)
{
hotelSegment.rate.roomTypeCode =
hotelReservationInfo.roomRateDetails.roomInformation.roomRateIdentifier.roomType;
}
if
(hotelReservationInfo.roomRateDetails.tariffDetails != null &&
hotelReservationInfo.roomRateDetails.tariffDetails.tariffInfo != null)
{
hotelSegment.rate.currency =
itinerary.hotelReservationInfo.roomRateDetails.tariffDetails.tariffInfo.currency;
}
}
if (hotelProduct != null && hotelProduct.hotelRoom !=
null && string.IsNullOrEmpty(hotelSegment.rate.roomTypeCode))
{
hotelSegment.rate.roomTypeCode =
itinerary.hotelProduct.hotelRoom.typeCode;
}
if (hotelProduct != null && hotelProduct.otherHotelInfo
!= null && string.IsNullOrEmpty(hotelSegment.rate.currency))
{
hotelSegment.rate.currency =
itinerary.hotelProduct.otherHotelInfo.currencyCode;
}
var dailyRates = new List<HotelSegment.DailyRate>();
if (itinerary.generalOption != null &&
itinerary.generalOption.Length > 0)
{
decimal commission = 0;//税率
foreach (var generalOption in
itinerary.generalOption)
{
if (generalOption == null ||
generalOption.optionDetail == null || generalOption.optionDetail.freetext == null
|| generalOption.optionDetail.freetext.Length == 0)
{
continue;
}
//pdf 没有定义 HKD8855.00 totalAmount
if (generalOption.optionDetail.type == "COM")
{
if (hotelSegment.rate.commission == null)
{
hotelSegment.rate.commission = new
HotelSegment.Rate.Commission();
}
hotelSegment.rate.commission.value =
generalOption.optionDetail.freetext[0];
commission =
GetTogether.Utility.NumberHelper.ToDecimal(generalOption.optionDetail.freetext[0],
0);
}
//pdf 没有定义 HKD8855.00 totalAmount
if (generalOption.optionDetail.type == "TTL")
{
var totalReg = @"(?<Currency>[a-z]{3})[\
s]*(?<Amount>[0-9]{1,10}[.]?[0-9]{0,10})";
Match matchReg =
System.Text.RegularExpressions.Regex.Match(generalOption.optionDetail.freetext[0],
totalReg, RegexOptions.IgnoreCase);
if (matchReg.Success)
{
hotelSegment.rate.amount =
GetTogether.Utility.NumberHelper.ToDecimal(matchReg.Groups["Amount"].Value, 0);
if
(string.IsNullOrEmpty(hotelSegment.rate.currency))
{
hotelSegment.rate.currency =
matchReg.Groups["Currency"].Value;
}
}
else
{
tracks.AddTrack("Exception", "TTL Not
Match", generalOption.optionDetail.freetext[0]);
}
}
//pdf 没有定义 15JUN 4200.00 每晚价钱
if (generalOption.optionDetail.type == "PRI")
{
throw;
}
dailyRates.Add(d);
}
else
{
tracks.AddTrack("Exception", "PRI Not
Match", generalOption.optionDetail.freetext[0]);
}
}
}
}
hotelSegment.rate.dailyRates = dailyRates.ToArray();
}
#endregion
#region confirmationCode
if (hotelReservationInfo != null &&
hotelReservationInfo.cancelOrConfirmNbr != null &&
hotelReservationInfo.cancelOrConfirmNbr.Length >
0)
{
List<string> confirmationCodes = new
List<string>();
foreach (var confirmNum in
itinerary.hotelReservationInfo.cancelOrConfirmNbr)
{
if (confirmNum.reservation != null && !
string.IsNullOrEmpty(confirmNum.reservation.controlNumber))
{
confirmationCodes.Add(confirmNum.reservation.controlNumber);
}
}
if (confirmationCodes.Count > 0)
{
hotelSegment.confirmationCode =
confirmationCodes.ToArray();
}
}
#endregion
#region timeSpan
if (itinerary.generalOption != null &&
itinerary.generalOption.Length > 0)
{
//hotelSegment.hotelCityName = "";
// hotelSegment.longitude = null;
// hotelSegment.latitude = null;
// hotelSegment.star = "";
// hotelSegment.address="";
// hotelSegment.numberInParty =
htl.Reservation.NumberInParty;
// hotelSegment.qty =
NumberHelper.ToInt(htl.Reservation.NumberInParty, 1);
if (pnrResult.hotelSegments == null)
{
pnrResult.hotelSegments = new List<HotelSegment>();
}
pnrResult.hotelSegments.Add(hotelSegment);
}
#endregion
}
#endregion
}
}
}
}
}
if (emails != null && emails.Count > 0)
{
if (pnrResult.Passengers != null)
{
if (pnrResult.Passengers.Count == emails.Count)
{
foreach (var pax in pnrResult.Passengers)
{
string email = emails[pax.number];
if (!string.IsNullOrEmpty(email))
{
if (email.EndsWith("/XX"))
{
email = email.Substring(0,
email.Length - 3);
}
//MICHELLE.WONG//SMCP.COM/XX
//85263542643/XX
pax.email = email;
}
}
}
}
}
foreach (PNR_ReplyDataElementsMasterDataElementsIndiv item
in pnrReply.dataElementsMaster.dataElementsIndiv)
{
switch (item.elementManagementData.segmentName)
{
case "OS"://Other Special Information element
if (item.otherDataFreetext != null &&
item.otherDataFreetext.Length > 0)
{
foreach (var oti in item.otherDataFreetext)
{
if (oti.freetextDetail != null)
{
SSR ssr = new SSR()
{
Airline =
oti.freetextDetail.companyId,
SSRText = oti.longFreetext,
PaxName =
item.elementManagementData.reference.number,
SSRCode = "OSI"
};
pnrResult.SSRList.Add(ssr);
}
}
}
break;
case "FA"://Ticket Number Automated Tickets element
if (item.otherDataFreetext != null &&
item.otherDataFreetext.Length > 0)
{
pnrResult.TicketTimeLimits.Add(item.otherDataFreetext[0].longFreetext);
}
break;
case "AI"://Accounting Information elemen
if (item.accounting != null && !
string.IsNullOrEmpty(item.accounting.account.clientReference))
{
pnrResult.CustomerIdentifier =
item.accounting.account.number;
}
//if (item.accounting != null && !
string.IsNullOrEmpty(item.accounting.account.number))
//{
// accountCode =
item.accounting.account.number;
//}
break;
case "OPW"://TicketDeadLine
if (item.optionElement != null
&& item.optionElement.optionElementInfo !=
null
&& !
string.IsNullOrEmpty(item.optionElement.optionElementInfo.freetext))
{
DateTime tktDeadline =
OTA.Generic.Airfare.TicketDeadline.GetTicketDeadline(item.optionElement.optionEleme
ntInfo.freetext, depDate);
tracks.AddTrack("Message",
item.elementManagementData.segmentName + ":" +
item.optionElement.optionElementInfo.freetext, tktDeadline);
if (tktDeadline != DateTime.MinValue)
{
tktDeadlines.Add(tktDeadline);
}
}
break;
default:
break;
}
#region bcode
string bCode = string.Empty;
foreach (PNR_ReplyDataElementsMasterDataElementsIndiv item
in pnrReply.dataElementsMaster.dataElementsIndiv)
{
switch (item.elementManagementData.segmentName)
{
case "OS":
if (item.otherDataFreetext != null &&
item.otherDataFreetext.Length > 0)
{
var freeText =
item.otherDataFreetext.FirstOrDefault(x => !string.IsNullOrEmpty(x.longFreetext) &&
x.longFreetext.StartsWith("BCODE"));
if (freeText != null)
{
bCode =
freeText.longFreetext.Substring(5);
}
}
break;
case "RM":
if (string.IsNullOrEmpty(bCode) &&
item.elementManagementData.segmentName == "RM")
{
if (item.extendedRemark != null &&
item.extendedRemark.structuredRemark != null
&& !
string.IsNullOrEmpty(item.extendedRemark.structuredRemark.freetext) &&
item.extendedRemark.structuredRemark.freetext.Contains("BCODE"))
{
System.Text.RegularExpressions.Regex
rgxBCode = new System.Text.RegularExpressions.Regex(@"[BCODE][ ]{1,}(?<BCode>[A-Z0-
9]{1,})[ ]{1,}[/]", System.Text.RegularExpressions.RegexOptions.None);
var matchBCode =
rgxBCode.Match(item.extendedRemark.structuredRemark.freetext);
if (matchBCode.Success)
{
bCode =
matchBCode.Groups["BCode"].Value;
}
}
}
break;
case "SSR":
if (string.IsNullOrEmpty(bCode) &&
item.elementManagementData.segmentName == "SSR")
{
if (item.serviceRequest != null &&
item.serviceRequest.ssr != null
&& !
string.IsNullOrEmpty(item.serviceRequest.ssr.type)
&&
item.serviceRequest.ssr.type.ToUpper() == "CRID"
&& item.serviceRequest.ssr.freeText !=
null
&&
item.serviceRequest.ssr.freeText.Length > 0
)
{
bCode =
item.serviceRequest.ssr.freeText[0];
}
}
break;
default:
break;
}
}
if (!string.IsNullOrEmpty(bCode))
{
extensions =
OTA.Generic.Entity.Extension.SetExtention(extensions,
OTA.Generic.Entity.Extension.ExtensionType.BCode, bCode);
}
#endregion
}
item.otherDataFreetext[0].longFreetext.IndexOf("/ET") > 0 ||
item.otherDataFreetext[0].longFreetext.IndexOf("/EV") > 0 ||
System.Text.RegularExpressions.MatchCollection
mCollection =
System.Text.RegularExpressions.Regex.Matches(item.otherDataFreetext[0].longFreetext
, regex);
if (mCollection != null && mCollection.Count >
0)
{
ticketSeg.ticketNumber =
mCollection[0].Groups["Ticket"].Value;
ticketSeg.airline =
mCollection[0].Groups["Airline"].Value;
ticketSeg.airlineCode =
mCollection[0].Groups["AirCode"].Value;
ticketSeg.isVoided =
mCollection[0].Groups["Status"].Value == "EV";
try
{
if (!
string.IsNullOrEmpty(mCollection[0].Groups["IssueDate"].Value))
{
ticketSeg.issueDate =
DateTime.ParseExact(mCollection[0].Groups["IssueDate"].Value, "ddMMMyy",
System.Globalization.DateTimeFormatInfo.InvariantInfo).AddHours(8);
}
}
catch (Exception ex)
{
tracks.AddTrack("Message", "Parse
IssueDate failed:" + mCollection[0].Groups["IssueDate"].Value);
}
if (mCollection[0].Groups["PaxType"].Value
== Generic.Utility.Passenger.GetPaxMappingCode(profile,
Generic.Definition.PaxType.INF, "INF")) infTicketSegs.Add(ticketSeg);
}
}
if (isEMD)
{
emdNumbers.Add(string.Concat(ticketSeg.airlineCode, ticketSeg.ticketNumber));
continue;
}
if (getTicketDetails)
{
ticketSeg.ticketSegmentIds = new List<int>();
}
foreach (var reference in
item.referenceForDataElement)
{
if (reference.qualifier == "PT")
{
ticketSeg.passengerNumber =
reference.number;
}
if (getTicketDetails && reference.qualifier ==
"ST")
{
int segId =
GetTogether.Utility.NumberHelper.ToInt(reference.number, 0);
if (!
ticketSeg.ticketSegmentIds.Contains(segId))
{
ticketSeg.ticketSegmentIds.Add(segId);
}
}
}
//SetFareAndTaxInfo(pnrReply, ticketSeg);
pnrResult.tickets.Add(ticketSeg);
}
}
if (infTicketSegs.Count > 0)
{
for (int i = 0; i < infTicketSegs.Count; i++)
{
infTicketSegs[i].passengerNumber =
(maxPaxnumExcludeInf + i + 1).ToString();
}
}
}
GetTogether.Mapping.ObjectHelper.CopyAllAttributes<Generic.Entity.Segment,
Generic.Entity.PNRRetrieve.TicketSegment>(ticketSegmentDict[tktSegId], tktSegment);
tktSegment.id = tktSegId;
pnrResult.ticketSegments.Add(tktSegment);
}
}
}
}
if (getTicketDetails && pnrResult != null &&
pnrResult.tickets != null && pnrResult.tickets.Count > 0)
{
if (pnrResult.tickets != null && pnrResult.tickets.Count >
0)
{
var tickets = new
Generic.Entity.Airfare.TicketImage.TicketImageRQ.TicketList();
foreach (var tkt in pnrResult.tickets)
{
tickets.Add(new
Generic.Entity.Airfare.TicketImage.TicketImageRQ.UO_Ticket()
{
AirCode = tkt.airlineCode,
Ticket = tkt.ticketNumber,
});
}
var ticketInfos =
OTA.Amadeus.Search.TicketImage.GetTicketImage(profile, new
Generic.Entity.Airfare.TicketImage.TicketImageRQ()
{
Pseudo = pnrResult.HomePseudoCityCode,
Tickets = tickets
}, tracks);
if (ticketInfos != null && ticketInfos.Tickets != null
&& ticketInfos.Tickets.Count > 0)
{
foreach (var tkt in pnrResult.tickets)
{
var matchTicketInfo =
ticketInfos.Tickets.Find(x => x.Airline == tkt.airlineCode && x.Ticket ==
tkt.ticketNumber);
if (matchTicketInfo != null)
{
tkt.issueDate = matchTicketInfo.IssueDate;
tkt.isVoided =
matchTicketInfo.TktSeg.Exists(x =>
x.SegStatus ==
Generic.Entity.Airfare.TicketImage.TicketImageRS.TktSegStatus.Voided ||
x.SegStatus ==
Generic.Entity.Airfare.TicketImage.TicketImageRS.TktSegStatus.Refunded
);
}
}
}
}
}
#endregion
}
else if (monInfo.qualifier ==
"F")//fare
{
if (!fareAmt.HasValue)
{
fareAmt =
decimal.Parse(monInfo.amount);
currency =
monInfo.currencyCode;
}
}
else if (monInfo.qualifier ==
"E")//Equivalent
{
fareAmt =
decimal.Parse(monInfo.amount);
currency = monInfo.currencyCode;
}
}
}
if (tsData.fareData.taxFields != null &&
tsData.fareData.taxFields.Length > 0)
{
if (fareAmt.HasValue)
{
//if (currency ==
profile.GenericSetting.Currency)
//{
// fare.fareCurr = currency;
//}
//else
//{
fare.sourceCurr = currency;
//}
var pax = pnrResult.Passengers.FirstOrDefault(p
=> referenceTravelers.Contains(p.number));
switch (pax.ageType)
{
case Generic.Definition.AgeType.Student:
//if (currency ==
profile.GenericSetting.Currency)
//{
// fare.fareAdult = fareAmt.Value;
//}
//else
//{
fare.sourceNetAdult = fareAmt.Value;
fare.sourceTaxAdult = taxAmout;
//}
fare.taxAdultDetail = taxItems;
break;
case Generic.Definition.AgeType.Adult:
//if (currency ==
profile.GenericSetting.Currency)
//{
// fare.fareAdult = fareAmt.Value;
//}
//else
//{
fare.sourceNetAdult = fareAmt.Value;
fare.sourceTaxAdult = taxAmout;
//}
fare.taxAdultDetail = taxItems;
break;
case Generic.Definition.AgeType.Child:
//if (currency ==
profile.GenericSetting.Currency)
//{
// fare.fareChild = fareAmt.Value;
//}
//else
//{
fare.sourceNetChild = fareAmt.Value;
//}
fare.taxChildDetail = taxItems;
fare.sourceTaxChild = taxAmout;
break;
case Generic.Definition.AgeType.Infant:
//if (currency ==
profile.GenericSetting.Currency)
//{
// fare.fareInfant = fareAmt.Value;
//}
//else
//{
fare.sourceNetInfant = fareAmt.Value;
fare.sourceTaxInfant = taxAmout;
//}
break;
case
Generic.Definition.AgeType.DisabledOrSoldier:
break;
default:
break;
}
fare.accountCode = accountCode;
if (!segRefFares.ContainsKey(segKey))
{
pnrResult.Fares.Add(fare);
segRefFares.Add(segKey, fare);
}
if (tsData.fareBasisInfo != null &&
tsData.fareBasisInfo.Length > 0)
{
if (pnrResult.Segments != null)
{
var si = 0;
foreach (var seg in pnrResult.Segments)
{
if (tsData.fareBasisInfo.Length >
si)
{
var fb =
tsData.fareBasisInfo[si];
if (fb != null)
{
var baggageAllowance =
fb.baggageAllowance;
if (!
string.IsNullOrEmpty(baggageAllowance))
{
if
(baggageAllowance.IndexOf("PC", StringComparison.InvariantCultureIgnoreCase) > 0)
{
baggageAllowance =
Regex.Replace(baggageAllowance, "PC", " pieces",
System.Text.RegularExpressions.RegexOptions.IgnoreCase);
}
else if
(baggageAllowance.IndexOf("K", StringComparison.InvariantCultureIgnoreCase) > 0)
{
baggageAllowance =
Regex.Replace(baggageAllowance, "K", " kg", RegexOptions.IgnoreCase);
}
}
seg.baggage =
baggageAllowance;
string fareBasis =
fb.fareBasis;
if (!
string.IsNullOrEmpty(fb.primaryCode))
{
fareBasis =
string.Concat(fb.primaryCode, fb.fareBasis);
}
if (!
string.IsNullOrEmpty(fareBasis) && !string.IsNullOrEmpty(fb.ticketDesignator))
{
fareBasis =
string.Concat(fareBasis, "/", fb.ticketDesignator);
}
switch (pax.ageType)
{
case
Generic.Definition.AgeType.Student:
if
(string.IsNullOrEmpty(seg.fareBasisAdult))
{
seg.fareBasisAdult = fareBasis;
}
break;
case
Generic.Definition.AgeType.Adult:
if
(string.IsNullOrEmpty(seg.fareBasisAdult))
{
seg.fareBasisAdult = fareBasis;
}
break;
case
Generic.Definition.AgeType.Child:
if
(string.IsNullOrEmpty(seg.fareBasisChild))
{
seg.fareBasisChild = fareBasis;
}
break;
case
Generic.Definition.AgeType.Infant:
if
(string.IsNullOrEmpty(seg.fareBasisInfant))
{
seg.fareBasisInfant = fareBasis;
}
break;
case
Generic.Definition.AgeType.DisabledOrSoldier:
break;
default:
break;
}
}
}
si++;
}
}
}
}
}
else
{
continue;
}
}
}
#endregion
#region seat
if (pnrReply.dataElementsMaster != null &&
pnrReply.dataElementsMaster.dataElementsIndiv != null)
{
foreach (var dataEle in
pnrReply.dataElementsMaster.dataElementsIndiv)
{
if (dataEle != null && dataEle.serviceRequest != null
&& dataEle.serviceRequest.ssrb != null && dataEle.serviceRequest.ssrb.Length > 0 &&
!string.IsNullOrEmpty(dataEle.serviceRequest.ssrb[0].data))
{
if (pnrResult.seats == null)
{
pnrResult.seats = new List<PassengerSeat>();
}
string rowNumberPattern = "[0-9]+";
Regex regexPattern = new Regex(rowNumberPattern,
RegexOptions.None | RegexOptions.IgnoreCase);
var c =
regexPattern.Match(dataEle.serviceRequest.ssrb[0].data);
var rowNumber = c.Value;
Generic.Entity.PNRRetrieve.PassengerSeat psgSeat =
new Generic.Entity.PNRRetrieve.PassengerSeat()
{
seatRowNumber = rowNumber,
seatColumnNumber =
dataEle.serviceRequest.ssrb[0].data.Replace(rowNumber, ""),
};
if (dataEle.referenceForDataElement != null &&
dataEle.referenceForDataElement.Length > 0)
{
foreach (var refData in
dataEle.referenceForDataElement)
{
if (refData.qualifier ==
OTA.Amadeus.PNR.V21_1.Enums.PNRRetrieve.ReferenceQualifier.PT.ToString())
{
psgSeat.passengerNumber =
refData.number;
if (pnrResult.Passengers != null &&
pnrResult.Passengers.Count > 0)
{
foreach (var passenger in
pnrResult.Passengers)
{
if (passenger.number ==
refData.number)
{
psgSeat.passengerName =
passenger.name;
break;
}
}
}
}
else if (refData.qualifier ==
OTA.Amadeus.PNR.V21_1.Enums.PNRRetrieve.ReferenceQualifier.ST.ToString())
{
psgSeat.number = refData.number;
if (pnrResult.Segments != null &&
pnrResult.Segments.Count > 0)
{
foreach (var segment in
pnrResult.Segments)
{
if (segment.sourceReference ==
refData.number)
{
psgSeat.flightNumber =
segment.flightNumber;
psgSeat.marketingCarrier =
segment.marketingCarrier;
break;
}
}
}
}
}
}
pnrResult.seats.Add(psgSeat);
}
}
}
#endregion
if (pnrResult.Segments != null && pnrResult.Segments.Count > 0)
{
string airline =
pnrResult.Segments.FirstOrDefault().marketingCarrier;
if (!string.IsNullOrEmpty(airline) && (airline == "AF" ||
airline == "KL") && pnrResult.TicketDeadline != DateTime.MinValue)
pnrResult.PriceGuaranteeDeadline =
pnrResult.TicketDeadline;
}
}
if (extensions != null && extensions.Count > 0)
{
pnrResult.extensions = extensions;
}
if (!pnrResult.isSuccess() && !
string.IsNullOrEmpty(pnrResult.RLOC))
{
if (pnrResult.Segments.Count == 0 ||
pnrResult.hotelSegments.Count == 0)
{
tracks.AddTrack("Message", string.Concat("not
segments ,segments all canceled,org errorCode:", pnrResult.errorCode));
pnrResult.errorCode =
OTA.Generic.ErrorCodeHelper.PNR.PNR_Canceled.Code;
}
}
}
catch (Exception ex)
{
tracks.AddExceptionTrack(ex.ToString(), "PNR_Reply");
OTA.Generic.Log.Error(ex);
pnrResult.msg = ex.Message;
tracks.EnableSave = true;
pnrResult.status = -1;
}
tracks.AddTrack("Message", "PNR_Reply", pnrResult);
return pnrResult;
}