mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-29 19:58:11 +00:00
implement intercity booking management and booking window websocket integration
This commit is contained in:
@@ -408,7 +408,9 @@ export class TrainSchedulingService {
|
||||
schedule.ruleImportWindowLeadDays ??
|
||||
liveCfg.importWindowLeadDays,
|
||||
exportBookingLeadHours:
|
||||
schedule.ruleExportBookingLeadHours ?? liveCfg.exportBookingLeadHours,
|
||||
dto.exportBookingLeadHours ??
|
||||
schedule.ruleExportBookingLeadHours ??
|
||||
liveCfg.exportBookingLeadHours,
|
||||
windowOpenHour:
|
||||
dto.windowOpenHour ?? schedule.ruleWindowOpenHour ?? liveCfg.windowOpenHour,
|
||||
windowCloseHour:
|
||||
@@ -432,6 +434,12 @@ export class TrainSchedulingService {
|
||||
schedule.direction === 'EXPORT'
|
||||
? computeExportWindowTimes(schedule.scheduledDepartureDate, merged)
|
||||
: computeImportWindowTimes(schedule.scheduledDepartureDate, merged, now);
|
||||
if (times.windowOpensAt.getTime() >= times.windowClosesAt.getTime()) {
|
||||
throw new BadRequestException(
|
||||
'These settings leave no booking window before departure — with the ' +
|
||||
'desk hours applied, the window would only open once the train has left.',
|
||||
);
|
||||
}
|
||||
|
||||
await this.dataSource.getRepository(TrainSchedule).update(id, {
|
||||
windowOpensAt: times.windowOpensAt,
|
||||
@@ -686,10 +694,9 @@ export class TrainSchedulingService {
|
||||
lockedLocomotives.push(locked);
|
||||
}
|
||||
|
||||
const direction = deriveScheduleDirection(
|
||||
route.originYard ?? { country: null },
|
||||
route.destinationYard ?? { country: null },
|
||||
);
|
||||
// Frozen on the route at create/update from the yard-country enum;
|
||||
// getSchedulableRoute already rejected DOMESTIC (intercity).
|
||||
const direction = this.resolveRouteDirection(route);
|
||||
|
||||
const trainSet = await this.buildEmptyTrainSet(manager, lockedLocomotives);
|
||||
// Effective capacity is capped by the weakest locomotive in the set.
|
||||
@@ -3447,9 +3454,27 @@ export class TrainSchedulingService {
|
||||
`Route ${formatRouteLabel(route)} is not available for scheduling (${route.status})`,
|
||||
);
|
||||
}
|
||||
// Intercity (same-country) service is not offered yet — only import/export
|
||||
// trains can be scheduled.
|
||||
if (this.resolveRouteDirection(route) === 'DOMESTIC') {
|
||||
throw new BadRequestException(
|
||||
`Route ${formatRouteLabel(route)} is an intercity route; intercity scheduling is not available yet`,
|
||||
);
|
||||
}
|
||||
return route;
|
||||
}
|
||||
|
||||
/** Stored route direction, deriving from yard countries for pre-migration rows. */
|
||||
private resolveRouteDirection(route: Route) {
|
||||
return (
|
||||
route.direction ??
|
||||
deriveScheduleDirection(
|
||||
route.originYard ?? { country: null },
|
||||
route.destinationYard ?? { country: null },
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
private mapEligibleBooking(booking: Booking) {
|
||||
return {
|
||||
id: booking.id,
|
||||
@@ -4054,6 +4079,7 @@ export class TrainSchedulingService {
|
||||
: null,
|
||||
reopenDelayMinutes: schedule.ruleReopenDelayMinutes ?? null,
|
||||
importWindowLeadDays: schedule.ruleImportWindowLeadDays ?? null,
|
||||
exportBookingLeadHours: schedule.ruleExportBookingLeadHours ?? null,
|
||||
docReviewMinutes: windowCfg.docReviewMinutes,
|
||||
paymentWindowMinutes: windowCfg.paymentWindowMinutes,
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user