From 12ab3f33b109f4803f39fbbebba15138618cbbb3 Mon Sep 17 00:00:00 2001 From: Roba Boru Date: Tue, 14 Jul 2026 16:54:24 +0300 Subject: [PATCH] Fix stop route --- .../src/modules/bookings/bookings.service.ts | 52 ++++++++++++++++--- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/apps/edr-passenger-api/src/modules/bookings/bookings.service.ts b/apps/edr-passenger-api/src/modules/bookings/bookings.service.ts index 7f09ffa49..a4b3617c9 100644 --- a/apps/edr-passenger-api/src/modules/bookings/bookings.service.ts +++ b/apps/edr-passenger-api/src/modules/bookings/bookings.service.ts @@ -1728,13 +1728,40 @@ export class BookingsService { ); } + // Resolves the passenger's actual boarding/alighting stations for one leg from + // originStationId/destinationStationId (set when the booking covers only part of a + // longer multi-stop schedule, e.g. train runs A→D but the passenger booked B→D) via + // the schedule's stopTimes, falling back to the schedule's own full-route endpoints + // when there's no segment override (older records, or a booking that covers the + // whole run). Mirrors notifications.service.ts's resolveSegmentStations — that's + // already applied to SMS/email; this brings the booking API (voucher, detail page, + // confirmation) to the same behavior instead of always showing the train's full route. + private resolveSegmentStations( + schedule: any, + originStationId: string | null | undefined, + destinationStationId: string | null | undefined, + ): { origin: any; destination: any } { + const stopTimes: any[] = schedule?.stopTimes ?? []; + const findStation = (stationId: string | null | undefined, fallback: any) => { + if (stationId && stopTimes.length > 0) { + const stop = stopTimes.find((st: any) => st.stationId === stationId); + if (stop?.station) return stop.station; + } + return fallback ?? null; + }; + return { + origin: findStation(originStationId, schedule?.originStation), + destination: findStation(destinationStationId, schedule?.destinationStation), + }; + } + async getByRef(bookingRefOrId: string) { const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(bookingRefOrId); const booking = await this.prisma.booking.findUnique({ where: isUuid ? { id: bookingRefOrId } : { bookingRef: bookingRefOrId }, include: { - schedule: { include: { originStation: true, destinationStation: true, train: true } }, - returnSchedule: { include: { originStation: true, destinationStation: true, train: true } }, + schedule: { include: { originStation: true, destinationStation: true, train: true, stopTimes: { include: { station: true } } } }, + returnSchedule: { include: { originStation: true, destinationStation: true, train: true, stopTimes: { include: { station: true } } } }, seats: { include: { seat: { include: { coach: { include: { coachType: { include: { seatClasses: true } } } } } } } }, paymentIntent: true, tickets: true, priceTier: { select: { priceMinor: true } }, @@ -1803,6 +1830,19 @@ export class BookingsService { }; } + const outboundSegment = this.resolveSegmentStations( + (booking as any).schedule, + (booking as any).originStationId, + (booking as any).destinationStationId, + ); + const returnSegment = (booking as any).returnSchedule + ? this.resolveSegmentStations( + (booking as any).returnSchedule, + (booking as any).returnOriginStationId, + (booking as any).returnDestinationStationId, + ) + : null; + return { id: booking.id, bookingRef: booking.bookingRef, status: booking.status, totalMinor: resolvePackageRoundTripTotal(booking, (booking as any).priceTier?.priceMinor, booking.adultCount, booking.childCount), currency: 'ETB', @@ -1819,8 +1859,8 @@ export class BookingsService { id: (booking as any).schedule.id, trainNumber: (booking as any).schedule.train.number, trainName: (booking as any).schedule.train.name, - origin: { id: (booking as any).schedule.originStation.id, name: (booking as any).schedule.originStation.name, code: (booking as any).schedule.originStation.code, city: (booking as any).schedule.originStation.city }, - destination: { id: (booking as any).schedule.destinationStation.id, name: (booking as any).schedule.destinationStation.name, code: (booking as any).schedule.destinationStation.code, city: (booking as any).schedule.destinationStation.city }, + origin: { id: outboundSegment.origin.id, name: outboundSegment.origin.name, code: outboundSegment.origin.code, city: outboundSegment.origin.city }, + destination: { id: outboundSegment.destination.id, name: outboundSegment.destination.name, code: outboundSegment.destination.code, city: outboundSegment.destination.city }, departureAt: (booking as any).schedule.departureAt, arrivalAt: (booking as any).schedule.arrivalAt, }, returnSchedule: (booking as any).returnSchedule @@ -1828,8 +1868,8 @@ export class BookingsService { id: (booking as any).returnSchedule.id, trainNumber: (booking as any).returnSchedule.train.number, trainName: (booking as any).returnSchedule.train.name, - origin: { id: (booking as any).returnSchedule.originStation.id, name: (booking as any).returnSchedule.originStation.name, code: (booking as any).returnSchedule.originStation.code, city: (booking as any).returnSchedule.originStation.city }, - destination: { id: (booking as any).returnSchedule.destinationStation.id, name: (booking as any).returnSchedule.destinationStation.name, code: (booking as any).returnSchedule.destinationStation.code, city: (booking as any).returnSchedule.destinationStation.city }, + origin: { id: returnSegment!.origin.id, name: returnSegment!.origin.name, code: returnSegment!.origin.code, city: returnSegment!.origin.city }, + destination: { id: returnSegment!.destination.id, name: returnSegment!.destination.name, code: returnSegment!.destination.code, city: returnSegment!.destination.city }, departureAt: (booking as any).returnSchedule.departureAt, arrivalAt: (booking as any).returnSchedule.arrivalAt, } : null,