diff --git a/src/Services/Air/AirFormat.js b/src/Services/Air/AirFormat.js index 7273134f..48ccba82 100644 --- a/src/Services/Air/AirFormat.js +++ b/src/Services/Air/AirFormat.js @@ -514,7 +514,23 @@ function setIndexesForSegments( }; } -function buildPassenger(name, traveler) { +function buildPassenger(nameObject, travelerObject) { + const traveler = Object.assign({}, travelerObject); + const name = Object.assign({}, nameObject); + + if (!traveler.Gender) { + const matchedGender = name.First.match(/(?:MSTR|MISS|MRS|MR|)$/gi); + + if (matchedGender) { + name.First = name.First.replace(/(?:MSTR|MISS|MRS|MR)$/gi, ''); + if (matchedGender[0] === 'MR' || matchedGender[0] === 'MSTR') { + traveler.Gender = 'M'; + } else if (matchedGender[0] === 'MISS' || matchedGender[0] === 'MRS') { + traveler.Gender = 'F'; + } + } + } + return Object.assign( { lastName: name.Last, @@ -522,14 +538,15 @@ function buildPassenger(name, traveler) { uapi_passenger_ref: traveler.Key, }, traveler.DOB ? { - birthDate: moment(traveler.DOB).format('YYYY-MM-DD'), + birthDate: moment(traveler.DOB) + .format('YYYY-MM-DD'), } : null, traveler.TravelerType ? { ageCategory: traveler.TravelerType, } : null, - traveler.Gender ? { - gender: traveler.Gender, - } : null + { + gender: traveler.Gender ? traveler.Gender : null + } ); } diff --git a/test/Air/AirParser.test.js b/test/Air/AirParser.test.js index 801b505d..460e6da5 100644 --- a/test/Air/AirParser.test.js +++ b/test/Air/AirParser.test.js @@ -1262,7 +1262,7 @@ describe('#AirParser', () => { const [passenger] = booking.passengers; - expect(passenger.firstName).to.equal('IANINAMRS'); + expect(passenger.firstName).to.equal('IANINA'); expect(passenger.lastName).to.equal('IVANOVA'); expect(passenger.uapi_passenger_ref).to.equal('Q4mT6BhYlDKA+D4IsGAAAA=='); }); @@ -1835,6 +1835,21 @@ describe('#AirParser', () => { }); }); + it('should test parsing of universal record retrieve request with infant passengers', () => { + const uParser = new Parser('universal:UniversalRecordImportRsp', 'v47_0', {}); + const parseFunction = airParser.AIR_IMPORT_REQUEST; + const xml = fs.readFileSync(`${xmlFolder}/getBooking-with-infant-passenger.xml`); + return uParser.parse(xml) + .then((json) => { + const jsonResult = parseFunction.call(uParser, json); + testBooking(jsonResult); + const [booking] = jsonResult; + expect(booking.passengers[3].firstName).to.be.equal('YUNJUN'); + expect(booking.passengers[3].ageCategory).to.be.equal('INF'); + expect(booking.passengers[3].gender).to.be.equal('M'); + }); + }); + describe('AIR_CANCEL_UR', () => { it('parse cancel by UR', () => { const uParser = new Parser(null, 'v47_0', { }); diff --git a/test/FakeResponses/Air/getBooking-with-infant-passenger.xml b/test/FakeResponses/Air/getBooking-with-infant-passenger.xml new file mode 100644 index 00000000..4624395d --- /dev/null +++ b/test/FakeResponses/Air/getBooking-with-infant-passenger.xml @@ -0,0 +1,116 @@ + + + + PNR already exists in Universal Record 93WFI2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 20MAR20 + + + + + + + + + + + + + + + + + DEPARTS ICN TERMINAL 1 - ARRIVES SIN TERMINAL 3 + *OZ ECONOMY CLASS* + + + + + DEPARTS SIN TERMINAL 1 - ARRIVES LHR TERMINAL 5 + + + + DEPARTS LHR TERMINAL 5 - ARRIVES FCO TERMINAL 3 + + + + DEPARTS FCO TERMINAL 3 - ARRIVES LHR TERMINAL 5 + **** FAVOURABLE AVAILABILITY GIVEN - FLIGHTS MARRIED **** + + + + DEPARTS LHR TERMINAL 5 - ARRIVES ICN TERMINAL 1 + ADD ADVANCE PASSENGER INFORMATION SSRS DOCA/DOCO/DOCS + PERSONAL DATA WHICH IS PROVIDED TO US IN CONNECTION + WITH YOUR TRAVEL MAY BE PASSED TO GOVERNMENT AUTHORITIES + FOR BORDER CONTROL AND AVIATION SECURITY PURPOSES + + + + OZRSVN IS 4850-6423 + + + ADTK1GTOOZ BY 18SEP 1156 SEL TIME ZONE OTHERWISE WILL BE XLD + + + OZCANCELLATION DUE TO NO TICKET + + + + + + + + + + + + + + +