Adding all the tests and fixes to the passengers app

This commit is contained in:
Muluhabt
2026-07-21 15:26:29 +03:00
parent f2ae9c883f
commit 7e6778d025
3279 changed files with 117 additions and 12612 deletions

View File

@@ -935,7 +935,9 @@ export class BookingsService {
status: 'PENDING_PAYMENT',
bookingType: 'ONE_WAY',
totalMinor: resolvedTotalMinor,
currency: displayCurrency,
// Charge basis is ETB (resolvedTotalMinor). The passenger's currency and amount live in
// displayCurrency/displayTotalMinor — keep currency coherent with totalMinor's units.
currency: Currency.ETB,
adultCount,
childCount,
displayCurrency,
@@ -1135,7 +1137,7 @@ export class BookingsService {
status: 'PENDING_PAYMENT',
bookingType: 'ROUND_TRIP',
totalMinor,
currency: displayCurrency,
currency: Currency.ETB, // ETB charge basis; passenger currency in displayCurrency/displayTotalMinor
adultCount,
childCount,
displayCurrency,
@@ -1328,7 +1330,7 @@ export class BookingsService {
status: 'PENDING_PAYMENT',
bookingType: 'TRANSIT',
totalMinor,
currency: displayCurrency,
currency: Currency.ETB, // ETB charge basis; passenger currency in displayCurrency/displayTotalMinor
adultCount,
childCount,
displayCurrency,
@@ -1538,7 +1540,7 @@ export class BookingsService {
destinationStationId: dto.leg2DestinationStationId,
status: 'PENDING_PAYMENT',
bookingType: 'ROUND_TRIP_TRANSIT',
totalMinor, currency: displayCurrency, adultCount, childCount, displayCurrency, displayTotalMinor,
totalMinor, currency: Currency.ETB, adultCount, childCount, displayCurrency, displayTotalMinor, // ETB charge basis; passenger currency in displayCurrency/displayTotalMinor
// Outbound transit leg-2
leg2ScheduleId: dto.leg2ScheduleId,
leg2OriginStationId: dto.transitStationId,

View File

@@ -304,7 +304,9 @@ export class GuestBookingService {
destinationStationId: dto.destinationStationId,
status: 'PENDING_PAYMENT',
totalMinor: resolvedTotalMinor,
currency: displayCurrency,
// Charge basis is ETB (resolvedTotalMinor). The passenger's currency and amount live in
// displayCurrency/displayTotalMinor — keep currency coherent with totalMinor's units.
currency: Currency.ETB,
adultCount,
childCount,
displayCurrency,
@@ -583,7 +585,7 @@ export class GuestBookingService {
status: 'PENDING_PAYMENT',
bookingType: 'ROUND_TRIP',
totalMinor,
currency: displayCurrency,
currency: Currency.ETB, // ETB charge basis; passenger currency in displayCurrency/displayTotalMinor
adultCount,
childCount,
displayCurrency,
@@ -787,7 +789,7 @@ export class GuestBookingService {
status: 'PENDING_PAYMENT',
bookingType: 'TRANSIT',
totalMinor,
currency: displayCurrency,
currency: Currency.ETB, // ETB charge basis; passenger currency in displayCurrency/displayTotalMinor
adultCount,
childCount,
displayCurrency,
@@ -1003,7 +1005,7 @@ export class GuestBookingService {
destinationStationId: dto.returnLeg2DestinationStationId,
status: 'PENDING_PAYMENT',
bookingType: 'ROUND_TRIP_TRANSIT',
totalMinor, currency: displayCurrency, adultCount, childCount, displayCurrency, displayTotalMinor,
totalMinor, currency: Currency.ETB, adultCount, childCount, displayCurrency, displayTotalMinor, // ETB charge basis; passenger currency in displayCurrency/displayTotalMinor
leg2ScheduleId: dto.leg2ScheduleId,
leg2OriginStationId: dto.transitStationId,
leg2DestinationStationId: dto.leg2DestinationStationId,

View File

@@ -23,8 +23,11 @@ export class FareEngineService {
if (!originStop) throw new BadRequestException('Origin station not found on this route');
if (!destStop) throw new BadRequestException('Destination station not found on this route');
if (originStop.sequence >= destStop.sequence)
throw new BadRequestException('Origin must come before destination in the route sequence');
// Origin and destination must be distinct stops, but EITHER direction is valid: a round-trip
// return leg traverses the same route high→low (e.g. C→A), so we price the segment by its
// absolute distance rather than rejecting the reverse order.
if (originStop.sequence === destStop.sequence)
throw new BadRequestException('Origin and destination must be different stops on this route');
const seatClass = await this.prisma.seatClass.findUnique({ where: { id: dto.seatClassId } });
if (!seatClass) throw new NotFoundException('Seat class not found');
@@ -43,8 +46,8 @@ export class FareEngineService {
},
}) ?? seatClass;
const totalDistanceKm = destStop.distanceKm! - originStop.distanceKm!;
if (totalDistanceKm < 0 || isNaN(totalDistanceKm))
const totalDistanceKm = Math.abs(destStop.distanceKm! - originStop.distanceKm!);
if (totalDistanceKm <= 0 || isNaN(totalDistanceKm))
throw new BadRequestException('Invalid distance calculation - check route stop distances');
const now = new Date();