diff --git a/src/libs/TripReservationUtils.ts b/src/libs/TripReservationUtils.ts index ddcd92beae81..6fa86fee05d5 100644 --- a/src/libs/TripReservationUtils.ts +++ b/src/libs/TripReservationUtils.ts @@ -421,7 +421,9 @@ function isPnrCancelled(pnr: Pnr): boolean { } if (data.railPnr) { const {outwardJourney, inwardJourney} = data.railPnr; - return isCancelledPnrStatus(outwardJourney.journeyStatus) && isCancelledPnrStatus(inwardJourney.journeyStatus); + const isOutwardCancelled = outwardJourney ? isCancelledPnrStatus(outwardJourney.journeyStatus) : true; + const isInwardCancelled = inwardJourney ? isCancelledPnrStatus(inwardJourney.journeyStatus) : true; + return isOutwardCancelled && isInwardCancelled; } return false; diff --git a/src/types/onyx/TripData.ts b/src/types/onyx/TripData.ts index 31f5976548b0..9bbbdaa9267c 100644 --- a/src/types/onyx/TripData.ts +++ b/src/types/onyx/TripData.ts @@ -1712,8 +1712,8 @@ type CarPnr = { /** Represents the structure of RailPnr. */ type RailPnr = { - /** Details of the inward journey. */ - inwardJourney: { + /** Details of the inward journey (undefined for one-way trips). */ + inwardJourney?: { /** Status of the inward journey. */ journeyStatus: string; diff --git a/tests/unit/TripReservationUtilsTest.ts b/tests/unit/TripReservationUtilsTest.ts index c9c888c4192c..8c618d277aae 100644 --- a/tests/unit/TripReservationUtilsTest.ts +++ b/tests/unit/TripReservationUtilsTest.ts @@ -2278,6 +2278,7 @@ const connectingAirPnrData = asDefined(airPnrConnecting.data.airPnr); const hotelPnrData = asDefined(hotelPnr.data.hotelPnr); const carPnrData = asDefined(carPnr.data.carPnr); const railPnrData = asDefined(railPnr.data.railPnr); +const railInwardJourney = asDefined(railPnrData.inwardJourney); describe('TripReservationUtils', () => { describe('getAirReservations', () => { @@ -2828,7 +2829,7 @@ describe('TripReservationUtils', () => { journeyStatus: CONST.PNR_STATUS.CANCELLED, }, inwardJourney: { - ...railPnrData.inwardJourney, + ...railInwardJourney, journeyStatus: CONST.PNR_STATUS.CANCELLED, }, }, @@ -2849,7 +2850,7 @@ describe('TripReservationUtils', () => { journeyStatus: CONST.PNR_STATUS.CANCELLED, }, inwardJourney: { - ...railPnrData.inwardJourney, + ...railInwardJourney, journeyStatus: 'CONFIRMED', }, }, @@ -2890,5 +2891,37 @@ describe('TripReservationUtils', () => { expect(isPnrCancelled(airPnrDirect)).toBe(false); expect(isPnrCancelled(railPnr)).toBe(false); }); + + it('should not crash when rail PNR has undefined inwardJourney (one-way trip)', () => { + const oneWayRail: Pnr = { + ...railPnr, + data: { + ...railPnr.data, + railPnr: { + ...railPnrData, + inwardJourney: undefined, + }, + }, + }; + expect(isPnrCancelled(oneWayRail)).toBe(false); + }); + + it('should return true when rail PNR has undefined inwardJourney and outwardJourney is cancelled', () => { + const cancelledOneWayRail: Pnr = { + ...railPnr, + data: { + ...railPnr.data, + railPnr: { + ...railPnrData, + inwardJourney: undefined, + outwardJourney: { + ...railPnrData.outwardJourney, + journeyStatus: CONST.PNR_STATUS.CANCELLED, + }, + }, + }, + }; + expect(isPnrCancelled(cancelledOneWayRail)).toBe(true); + }); }); });