diff --git a/server/src/nest/booking-import/kitinerary-mapper.ts b/server/src/nest/booking-import/kitinerary-mapper.ts index b90c9422e..7fdf9c100 100644 --- a/server/src/nest/booking-import/kitinerary-mapper.ts +++ b/server/src/nest/booking-import/kitinerary-mapper.ts @@ -709,7 +709,12 @@ function segmentDetail(r: KiReservation): { } return undefined; }; - const seat = pick('seat', 'seatNumber'); + // KItinerary writes a flight seat as airplaneSeat and a rail seat as + // reservedTicket.ticketedSeat.seatNumber, and drops any other seat key. + const ticket = r.reservedTicket as { ticketedSeat?: { seatNumber?: unknown } } | undefined; + const ticketSeat = ticket?.ticketedSeat?.seatNumber; + const seat = + pick('seat', 'seatNumber', 'airplaneSeat') ?? (ticketSeat != null && ticketSeat !== '' ? ticketSeat : undefined); const cls = pick('class', 'bookingClass', 'fareClass', 'serviceClass', 'seatingType'); const platform = pick('platform', 'departurePlatform'); const price = pick('price', 'priceAmount', 'totalPrice', 'total'); diff --git a/server/tests/unit/nest/booking-import/kitineraryMapper.test.ts b/server/tests/unit/nest/booking-import/kitineraryMapper.test.ts index fc19f6e00..eac174312 100644 --- a/server/tests/unit/nest/booking-import/kitineraryMapper.test.ts +++ b/server/tests/unit/nest/booking-import/kitineraryMapper.test.ts @@ -634,3 +634,23 @@ describe('kitinerary mapper: a prompt-shaped AI lodging (#2477)', () => { }); }); }); + +describe('kitinerary mapper: the seat as KItinerary writes it', () => { + it('reads a flight seat from airplaneSeat', () => { + const node = { + ...flight('CE9P8V', SFO, JFK, '2026-06-11T10:00:00', '2026-06-11T18:30:00', '450'), + airplaneSeat: '4D', + }; + const { items } = mapReservations(legs(node), 'test.json'); + expect(items[0].metadata).toMatchObject({ seat: '4D' }); + }); + + it('reads a seat from reservedTicket.ticketedSeat.seatNumber', () => { + const node = { + ...flight('CE9P8V', SFO, JFK, '2026-06-11T10:00:00', '2026-06-11T18:30:00', '450'), + reservedTicket: { ticketedSeat: { seatNumber: '23A' } }, + }; + const { items } = mapReservations(legs(node), 'test.json'); + expect(items[0].metadata).toMatchObject({ seat: '23A' }); + }); +});