mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-09-08 15:58:18 +00:00
feat: add seat conflict assertion for route bookings
This commit is contained in:
@@ -13,6 +13,7 @@ import { FareEngineService } from '../fare-engine/fare-engine.service';
|
||||
import { PaymentsService } from '../payments/payments.service';
|
||||
import { MAX_PAYMENT_HOURS } from '../../common/utils/payment-deadline.utils';
|
||||
import { Currency, PassengerCategory, IdDocumentType } from '@prisma/client';
|
||||
import { JourneyDirection } from '../seats/seats.dto';
|
||||
import { resolveCurrencyFromNationality } from '../fare-engine/fare-engine.dto';
|
||||
import { DeleteOperationException } from '../../common/exceptions/delete-operation.exception';
|
||||
import { AuditService } from '../../common/audit.service';
|
||||
@@ -856,6 +857,14 @@ export class BookingsService {
|
||||
const destStop = schedule.stopTimes.find(s => s.stationId === dto.destinationStationId);
|
||||
if (!originStop || !destStop) throw new NotFoundException('Origin or destination not found');
|
||||
|
||||
await this.seatsService.assertNoRouteSeatConflict({
|
||||
scheduleId: dto.scheduleId,
|
||||
seatIds: requestedSeatIds,
|
||||
originStationId: dto.originStationId,
|
||||
destinationStationId: dto.destinationStationId,
|
||||
journeyDirection: JourneyDirection.ONE_WAY,
|
||||
});
|
||||
|
||||
const [passengersData, iamContact] = await Promise.all([
|
||||
this.processPassengers(dto.passengers as any[]),
|
||||
this.resolveIamContact(dto.passengerId),
|
||||
@@ -1052,6 +1061,21 @@ export class BookingsService {
|
||||
throw new NotFoundException('Origin or destination stops not found');
|
||||
}
|
||||
|
||||
await this.seatsService.assertNoRouteSeatConflict({
|
||||
scheduleId: dto.scheduleId,
|
||||
seatIds: holdObSeatIds,
|
||||
originStationId: dto.originStationId,
|
||||
destinationStationId: dto.destinationStationId,
|
||||
journeyDirection: JourneyDirection.OUTBOUND,
|
||||
});
|
||||
await this.seatsService.assertNoRouteSeatConflict({
|
||||
scheduleId: dto.returnScheduleId,
|
||||
seatIds: holdRetSeatIds,
|
||||
originStationId: dto.returnOriginStationId,
|
||||
destinationStationId: dto.returnDestinationStationId,
|
||||
journeyDirection: JourneyDirection.RETURN,
|
||||
});
|
||||
|
||||
const [passengersData, iamContact] = await Promise.all([
|
||||
this.processRoundTripPassengers(dto.passengers as any[]),
|
||||
this.resolveIamContact(dto.passengerId),
|
||||
@@ -1295,6 +1319,21 @@ export class BookingsService {
|
||||
if (!leg1OriginStop || !leg1DestStop) throw new NotFoundException('Leg-1 origin or transit station not found on schedule');
|
||||
if (!leg2OriginStop || !leg2DestStop) throw new NotFoundException('Transit or leg-2 destination station not found on leg-2 schedule');
|
||||
|
||||
await this.seatsService.assertNoRouteSeatConflict({
|
||||
scheduleId: dto.scheduleId,
|
||||
seatIds: leg1SeatIds,
|
||||
originStationId: dto.originStationId,
|
||||
destinationStationId: dto.transitStationId,
|
||||
journeyDirection: JourneyDirection.ONE_WAY,
|
||||
});
|
||||
await this.seatsService.assertNoRouteSeatConflict({
|
||||
scheduleId: dto.leg2ScheduleId,
|
||||
seatIds: leg2SeatIds,
|
||||
originStationId: dto.transitStationId,
|
||||
destinationStationId: dto.leg2DestinationStationId,
|
||||
journeyDirection: JourneyDirection.ONE_WAY,
|
||||
});
|
||||
|
||||
const [passengersData, iamContact] = await Promise.all([
|
||||
this.processPassengers(dto.passengers as any[]),
|
||||
this.resolveIamContact(dto.passengerId),
|
||||
@@ -1490,6 +1529,35 @@ export class BookingsService {
|
||||
if (!retL1Origin || !retL1Dest) throw new NotFoundException('Return leg-1: origin or transit station not found');
|
||||
if (!retL2Origin || !retL2Dest) throw new NotFoundException('Return leg-2: transit or destination not found');
|
||||
|
||||
await this.seatsService.assertNoRouteSeatConflict({
|
||||
scheduleId: dto.scheduleId,
|
||||
seatIds: (dto.passengers as any[]).map(p => p.seatId),
|
||||
originStationId: dto.originStationId,
|
||||
destinationStationId: dto.transitStationId,
|
||||
journeyDirection: JourneyDirection.OUTBOUND,
|
||||
});
|
||||
await this.seatsService.assertNoRouteSeatConflict({
|
||||
scheduleId: dto.leg2ScheduleId,
|
||||
seatIds: (dto.passengers as any[]).map(p => p.leg2SeatId ?? p.seatId),
|
||||
originStationId: dto.transitStationId,
|
||||
destinationStationId: dto.leg2DestinationStationId,
|
||||
journeyDirection: JourneyDirection.OUTBOUND,
|
||||
});
|
||||
await this.seatsService.assertNoRouteSeatConflict({
|
||||
scheduleId: dto.returnScheduleId,
|
||||
seatIds: (dto.passengers as any[]).map(p => p.returnSeatId),
|
||||
originStationId: dto.returnOriginStationId,
|
||||
destinationStationId: dto.returnTransitStationId,
|
||||
journeyDirection: JourneyDirection.RETURN,
|
||||
});
|
||||
await this.seatsService.assertNoRouteSeatConflict({
|
||||
scheduleId: dto.returnLeg2ScheduleId,
|
||||
seatIds: (dto.passengers as any[]).map(p => p.returnLeg2SeatId ?? p.returnSeatId),
|
||||
originStationId: dto.returnTransitStationId,
|
||||
destinationStationId: dto.returnLeg2DestinationStationId,
|
||||
journeyDirection: JourneyDirection.RETURN,
|
||||
});
|
||||
|
||||
const [passengersData, iamContact] = await Promise.all([
|
||||
this.processRoundTripPassengers(dto.passengers as any[]),
|
||||
this.resolveIamContact(dto.passengerId),
|
||||
|
||||
@@ -13,6 +13,7 @@ import { PaymentsService } from '../payments/payments.service';
|
||||
import { SmsClientService } from '../notifications/sms-client.service';
|
||||
import { CreateGuestBookingDto, SavedPassengerProfileDto, IssueReservationBookingDto, ReservationBookingKind } from './guest-booking.dto';
|
||||
import { Currency, PassengerCategory, IdDocumentType, PaymentMethodType, PaymentIntentStatus } from '@prisma/client';
|
||||
import { JourneyDirection } from '../seats/seats.dto';
|
||||
import { resolveCheckinCutoff } from '../../common/utils/checkin-cutoff.utils';
|
||||
import { computePaymentDeadline } from '../../common/utils/payment-deadline.utils';
|
||||
import { randomUUID } from 'crypto';
|
||||
|
||||
Reference in New Issue
Block a user