0% found this document useful (0 votes)
15 views31 pages

2

Uploaded by

huangjunfeng1987
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
15 views31 pages

2

Uploaded by

huangjunfeng1987
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 31

public static OTA.Generic.Entity.PNRRetrieve.

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;
}

if (pnrReply.pnrHeader != null && pnrReply.pnrHeader.Length > 1


&& pnrReply.pnrHeader[1].reservationInfo != null &&
pnrReply.pnrHeader[1].reservationInfo.Length > 0)
{
pnrResult.sourceSystemRef =
pnrReply.pnrHeader[1].reservationInfo[0].controlNumber;
}

if (pnrReply.securityInformation != null &&


pnrReply.securityInformation.secondRpInformation != null)
{
pnrResult.CreateOn =
DateTime.ParseExact(pnrReply.securityInformation.secondRpInformation.creationDate +
pnrReply.securityInformation.secondRpInformation.creationTime, "ddMMyyHHmm",
System.Globalization.DateTimeFormatInfo.InvariantInfo).AddHours(8);
pnrResult.HomePseudoCityCode =
pnrReply.securityInformation.secondRpInformation.creationOfficeId;
bkgSineIn =
pnrReply.securityInformation.secondRpInformation.agentSignature;
}
if (pnrReply.dataElementsMaster != null &&
pnrReply.dataElementsMaster.dataElementsIndiv != null)
{
foreach (var dataEle in
pnrReply.dataElementsMaster.dataElementsIndiv)
{
//Ticketing type
//if (dataEle.ticketElement != null &&
dataEle.ticketElement.ticket != null && !
string.IsNullOrEmpty(dataEle.ticketElement.ticket.date))
//{
// pnrResult.TicketDeadline =
DateTime.ParseExact(dataEle.ticketElement.ticket.date, "ddMMyy",
System.Globalization.CultureInfo.CurrentCulture);
//}
if (dataEle.otherDataFreetext != null &&
dataEle.otherDataFreetext.Length > 0)
{
foreach (var dataTxt in dataEle.otherDataFreetext)
{
if (dataTxt == null) continue;
pnrResult.Remarks.Add(new Remark()
{
type = dataTxt.freetextDetail == null ?
string.Empty : dataTxt.freetextDetail.type,
text = dataTxt.longFreetext,
});
}
}
if (dataEle.miscellaneousRemarks != null &&
dataEle.miscellaneousRemarks.remarks != null && !
string.IsNullOrEmpty(dataEle.miscellaneousRemarks.remarks.freetext))
{
pnrResult.Remarks.Add(new Remark()
{
type =
dataEle.miscellaneousRemarks.remarks.type,
text =
dataEle.miscellaneousRemarks.remarks.freetext,
});
}
if (dataEle.optionElement != null &&
dataEle.optionElement.optionElementInfo != null && !
string.IsNullOrEmpty(dataEle.optionElement.optionElementInfo.freetext))
{
pnrResult.Remarks.Add(new Remark()
{
type = string.Empty,
text =
dataEle.optionElement.optionElementInfo.freetext,
});
}
if (dataEle.optionElement != null &&
dataEle.optionElement.optionElementInfo != null && !
string.IsNullOrEmpty(dataEle.optionElement.optionElementInfo.date))
{

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

#region Hotel 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.depDate == null
|| itinerary.elementManagementItinerary == null
|| !new List<string>() {

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 (itinerary.hotelProduct != null &&


itinerary.hotelProduct.hotelRoom != null)
{
hotelSegment.numberInParty =
itinerary.hotelProduct.hotelRoom.occupancy;
hotelSegment.qty =
GetTogether.Utility.NumberHelper.ToInt(hotelSegment.numberInParty, 1);
}
//requestorIATACode
if (hotelReservationInfo != null &&
hotelReservationInfo.bookingSource != null &&

hotelReservationInfo.bookingSource.originIdentification != null &&


!
string.IsNullOrEmpty(hotelReservationInfo.bookingSource.originIdentification.origin
atorId))
{
string requestorIATACode =
itinerary.hotelReservationInfo.bookingSource.originIdentification.originatorId;
hotelSegment.requestorIATACode = new string[1]
{ requestorIATACode };
}

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];
}

//hotelCityCode chainCode hotelCode hotelName start


if (travelProduct != null &&
travelProduct.boardpointDetail != null)
{
hotelSegment.hotelCityCode =
itinerary.travelProduct.boardpointDetail.cityCode;
}
if (hotelReservationInfo != null &&
hotelReservationInfo.hotelPropertyInfo != null)
{
if
(hotelReservationInfo.hotelPropertyInfo.hotelReference != null)
{
hotelSegment.hotelCode =
itinerary.hotelReservationInfo.hotelPropertyInfo.hotelReference.hotelCode;
// hotelSegment.gdsHotelCode =
itinerary.hotelReservationInfo.hotelPropertyInfo.hotelReference.hotelCode;
hotelSegment.chainCode =
itinerary.hotelReservationInfo.hotelPropertyInfo.hotelReference.chainCode;
hotelSegment.hotelCityCode =
itinerary.hotelReservationInfo.hotelPropertyInfo.hotelReference.cityCode;
}
hotelSegment.hotelName =
hotelReservationInfo.hotelPropertyInfo.hotelName;
}
if (hotelProduct != null)
{
if (hotelProduct.property != null)
{
if
(string.IsNullOrEmpty(hotelSegment.hotelName))
{
hotelSegment.hotelName =
itinerary.hotelProduct.property.name;
}
if
(string.IsNullOrEmpty(hotelSegment.hotelCode))
{
hotelSegment.hotelCode =
itinerary.hotelProduct.property.code;
}
}
}
//hotelCityCode chainCode hotelCode hotelName end
if (itinerary.generalOption != null &&
itinerary.generalOption.Length > 0)
{
foreach (var generalOption in
itinerary.generalOption)
{
if (generalOption == null ||
generalOption.optionDetail == null || generalOption.optionDetail.freetext == null
|| generalOption.optionDetail.freetext.Length == 0)
{
continue;
}
//pdf 没有定义,参考 Sabre 找最类似的属性
if (generalOption.optionDetail.type == "G")
{
hotelSegment.guarantee =
generalOption.optionDetail.freetext[0];
}
}
}
#endregion

var fromDate = DateTime.MinValue;


var toDate = DateTime.MinValue;
#region timeSpan
if (travelProduct != null && travelProduct.product !=
null)
{
hotelSegment.timeSpan = new
HotelSegment.TimeSpan();

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)
{

foreach (var generalOption in


itinerary.generalOption)
{
if (generalOption == null ||
generalOption.optionDetail == null || generalOption.optionDetail.freetext == null
|| generalOption.optionDetail.freetext.Length == 0)
{
continue;
}
//pdf 没有定义 02 night
if (generalOption.optionDetail.type ==
"NGT")
{
int night =
GetTogether.Utility.NumberHelper.ToInt(generalOption.optionDetail.freetext[0], 0);
toDate = fromDate.AddDays(night);
}
}
}
}

#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")
{

var priSeg = @"(?<Date>[0-9]{1,2}[A-Z]{3})[


]*(?<Amount>[0-9]{1,10}[.]?[0-9]{0,10})";
Match matchReg =
System.Text.RegularExpressions.Regex.Match(generalOption.optionDetail.freetext[0],
priSeg, RegexOptions.IgnoreCase);//f6 cn
if (matchReg.Success)
{
var d = new
Generic.Entity.PNRRetrieve.HotelSegment.DailyRate();
d.amount =
GetTogether.Utility.NumberHelper.ToDecimal(matchReg.Groups["Amount"].Value, 0);
if (commission > 0)
{
d.amount = d.amount * (100 +
commission) / 100;
}
try
{
//ticketSeg.IssueDate =
DateTime.ParseExact(mCollection[0].Groups["IssueDate"].Value, "ddMMMyy",
System.Globalization.DateTimeFormatInfo.InvariantInfo).AddHours(8);
var dateStr =
matchReg.Groups["Date"].Value;
var date =
DateTime.ParseExact(dateStr, "ddMMM",
System.Globalization.DateTimeFormatInfo.InvariantInfo);
if (fromDate != DateTime.MinValue
&& toDate != DateTime.MinValue)
{
for (var i = 0; i <
toDate.Subtract(fromDate).Days; i++)
{
if
(fromDate.AddDays(i).Month == date.Month && fromDate.AddDays(i).Day == date.Day)
{
d.date =
fromDate.AddDays(i);
}
}
}
}
catch (Exception)
{

throw;
}

dailyRates.Add(d);

}
else
{
tracks.AddTrack("Exception", "PRI Not
Match", generalOption.optionDetail.freetext[0]);
}
}
}
}
hotelSegment.rate.dailyRates = dailyRates.ToArray();

if (fromDate != DateTime.MinValue && toDate !=


DateTime.MinValue)
{
hotelSegment.rate.perNightAmout =
hotelSegment.rate.amount / toDate.Subtract(fromDate).Days;

}
#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)
{

foreach (var generalOption in


itinerary.generalOption)
{
if (generalOption == null ||
generalOption.optionDetail == null || generalOption.optionDetail.freetext == null
|| generalOption.optionDetail.freetext.Length == 0)
{
continue;
}
//pdf 没有定义 Cancellation policy DES
if (generalOption.optionDetail.type == "CXL")
{
//24HRS PRIOR OR 1 NIGHT FEE/ CREDIT CARD
REQ
if (hotelSegment.cancellationPolicy ==
null)
{
hotelSegment.cancellationPolicy = new
HotelSegment.CancellationPolicy();
}
hotelSegment.cancellationPolicy.terms =
generalOption.optionDetail.freetext[0];
}
}
}
#endregion

//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

string accountCode = null;


#region SSR TicketDeadLine(OPW,ADTK,OTHS 取最小值)

var depDate = DateTime.Now;


if (pnrResult.Segments != null && pnrResult.Segments.Count > 0)
{
depDate = pnrResult.Segments[0].GetDepDateTime();
}
if (pnrReply.dataElementsMaster != null &&
pnrReply.dataElementsMaster.dataElementsIndiv != null &&
pnrReply.dataElementsMaster.dataElementsIndiv.Length > 0)
{
var emails = new Dictionary<string, string>();
foreach (PNR_ReplyDataElementsMasterDataElementsIndiv item
in pnrReply.dataElementsMaster.dataElementsIndiv)
{
if (item != null)
{
if (item.serviceRequest != null &&
item.serviceRequest.ssr != null)
{
SSR ssr = new SSR();
ssr.Airline =
item.serviceRequest.ssr.companyId;
ssr.PaxName = item.serviceRequest.ssr.quantity;
ssr.SSRType = item.serviceRequest.ssr.type;
ssr.SSRCode = "SSR";
if (item.frequentFlyerInformationGroup != null
&& item.frequentFlyerInformationGroup.frequentTravellerInfo != null &&
item.frequentFlyerInformationGroup.frequentTravellerInfo.frequentTraveler != null)
{
//FQTV
ssr.SSRText =
string.Concat(item.frequentFlyerInformationGroup.frequentTravellerInfo.frequentTrav
eler.company,
item.frequentFlyerInformationGroup.frequentTravellerInfo.frequentTraveler.membershi
pNumber);
}
else
{
ssr.SSRText =
GetTogether.Utility.StringHelper.ArrayToString(item.serviceRequest.ssr.freeText,
"|");
}
pnrResult.SSRList.Add(ssr);
if (item.serviceRequest.ssr.type == "CTCE"
&&
item.serviceRequest.ssr.freeText != null && item.serviceRequest.ssr.freeText.Length
> 0)
{
foreach (var dataEle in
item.referenceForDataElement)
{
if
(OTA.Amadeus.Definition.PNR_AddMultiElements.ReferenceQualifier.PassengerTatooRefer
enceNumber.Equals(dataEle.qualifier))
{
emails.Add(dataEle.number,
item.serviceRequest.ssr.freeText[0]);
}

}
}
}
}
}
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
}

if (pnrResult.SSRList != null && pnrResult.SSRList.Count > 0)


{
foreach (var ssr in pnrResult.SSRList)
{
if (ssr.SSRType == "ADTK" || ssr.SSRType == "OTHS")
{
//ADV TKT NBR TO CX BY 12MAY 0523 GMT OR SUBJECT TO
CANCEL 正则拆分
DateTime tktDeadline =
OTA.Generic.Airfare.TicketDeadline.GetTicketDeadline(ssr.SSRText, depDate);
tracks.AddTrack("Message", ssr.SSRType + ":" +
ssr.SSRText, tktDeadline);
if (tktDeadline != DateTime.MinValue)
{
tktDeadlines.Add(tktDeadline);
//if (pnrResult.TicketDeadline ==
DateTime.MinValue || tktDeadline < pnrResult.TicketDeadline)
// pnrResult.TicketDeadline = tktDeadline;
}
}
}
}
if (tktDeadlines.Count > 0)
{
tracks.AddTrack("Message", "tktDeadlines",
OTA.Generic.JsonHelper.JsonSerializer(tktDeadlines));
pnrResult.TicketDeadline = tktDeadlines.OrderBy(x =>
x).FirstOrDefault();
}
#endregion

#region ticket segments


if (pnrReply.dataElementsMaster != null &&
pnrReply.dataElementsMaster.dataElementsIndiv != null &&
pnrReply.dataElementsMaster.dataElementsIndiv.Length > 0)
{
List<Ticket> infTicketSegs = new List<Ticket>();
pnrResult.tickets = new List<Ticket>();
foreach (PNR_ReplyDataElementsMasterDataElementsIndiv item
in pnrReply.dataElementsMaster.dataElementsIndiv)
{
bool getTickets = false;
string regex = "";
if (item.elementManagementData.segmentName == "FA" &&
item.otherDataFreetext != null
&& item.otherDataFreetext.Length > 0
&& !
string.IsNullOrEmpty(item.otherDataFreetext[0].longFreetext)
&& (

item.otherDataFreetext[0].longFreetext.IndexOf("/ET") > 0 ||

item.otherDataFreetext[0].longFreetext.IndexOf("/EV") > 0 ||

item.otherDataFreetext[0].longFreetext.IndexOf("/DT") > 0))


{
getTickets = true;
regex = "(?<PaxType>[A-Z]{3})[ ]*(?<AirCode>[0-9]
{3})-(?<Ticket>[0-9]{10,13})[0-9|-]{0,10}/(?<Status>[A-Z]{2})(?<Airline>[A-Z0-9]
{2})/.*?(?<IssueDate>[0-9]{2}[A-Z]{3}[0-9]{2})";
}
if (item.elementManagementData.segmentName == "FHE")
{
getTicketDetails = true;
getTickets = true;
regex = "(?<PaxType>[A-Z]{3})[ ]*(?<AirCode>[0-9]
{3})-(?<Ticket>[0-9]{10,13})[0-9|-]{0,10}";
}
if (getTickets)
{
bool isEMD =
item.otherDataFreetext[0].longFreetext.IndexOf("/DT") > 0;
Ticket ticketSeg = new Ticket();
if (item.otherDataFreetext != null &&
item.otherDataFreetext.Length > 0)
{
// PAX
160-6710034215/ETCX/01JUL15/HKGH222V1/13305040
//PAX
160-6710034227/ETCX/HKD10781/08JUL15/HKGH222V1/13305040
//INF
217-9657229561/ETTG/HKD570/07NOV15/HKGH222V1/13305040
//pendding J5AHBS J9TIMQ JEQVUZ PAX 724-
9481641944-45/ETLX/HKD47251/29NOV19/HKG383118/13305084 两个票号 9481641944 和 9481641945

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();
}
}
}

if (ticketSegmentDict != null && ticketSegmentDict.Count > 0


&& pnrResult.tickets != null && pnrResult.tickets.Count >
0)
{
pnrResult.ticketSegments = new List<TicketSegment>();
foreach (var tkt in pnrResult.tickets)
{
foreach (var tktSegId in tkt.ticketSegmentIds)
{
var ticketObj = pnrResult.ticketSegments.Find(x =>
x.id == tktSegId);
if (ticketObj == null &&
ticketSegmentDict.ContainsKey(tktSegId))
{
Generic.Entity.PNRRetrieve.TicketSegment
tktSegment = new TicketSegment();

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

#region fare Item


if (pnrReply != null && pnrReply.tstData != null &&
pnrReply.tstData.Length > 0)
{
pnrResult.Fares = new List<Fare>();
Dictionary<string, Fare> segRefFares = new
Dictionary<string, Fare>();
foreach (var tsData in pnrReply.tstData)
{
if (tsData.fareData == null ||
tsData.referenceForTstData == null)
{
continue;
}
List<string> referenceTravelers = new List<string>();
List<string> refrenceSegs = new List<string>();

foreach (var refData in tsData.referenceForTstData)


{
if (refData.qualifier ==
OTA.Amadeus.PNR.V21_1.Enums.PNRRetrieve.ReferenceQualifier.PT.ToString())
{
referenceTravelers.Add(refData.number);
}
else if (refData.qualifier ==
OTA.Amadeus.PNR.V21_1.Enums.PNRRetrieve.ReferenceQualifier.ST.ToString())
{
refrenceSegs.Add(refData.number);
}
}
if (refrenceSegs.Count > 0)
{
Fare fare = null;
string segKey =
GetTogether.Utility.StringHelper.ArrayToString(refrenceSegs, "-");
if (segRefFares.ContainsKey(segKey))
{
fare = segRefFares[segKey];
}
else
{
fare = new Fare()
{
SegmentIds = refrenceSegs,
};
if (tsData.tstGeneralInformation != null &&
tsData.tstGeneralInformation.generalInformation != null)
{
fare.number =
tsData.tstGeneralInformation.generalInformation.tstReferenceNumber;
}
}
decimal? fareAmt = null;
decimal taxAmout = 0.0m;
string currency = null;
List<OTA.Generic.Entity.TaxItem> taxItems = new
List<OTA.Generic.Entity.TaxItem>();
if (tsData.fareData != null)
{
if (tsData.fareData.monetaryInfo != null)
{
foreach (var monInfo in
tsData.fareData.monetaryInfo)
{
if (monInfo.qualifier == "T")//total
{

}
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)
{

foreach (var tax in


tsData.fareData.taxFields)
{
taxItems.Add(new
OTA.Generic.Entity.TaxItem()
{
code = tax.taxCountryCode,
amount =
decimal.Parse(tax.taxAmount),
sourceCurrency = tax.taxCurrency,
});
taxAmout +=
decimal.Parse(tax.taxAmount);
}
}

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;
}

You might also like