diff --git a/apps/edr-freight-api/src/modules/train-scheduling/train-scheduling.service.ts b/apps/edr-freight-api/src/modules/train-scheduling/train-scheduling.service.ts index be6a8ea10..44e0eff14 100644 --- a/apps/edr-freight-api/src/modules/train-scheduling/train-scheduling.service.ts +++ b/apps/edr-freight-api/src/modules/train-scheduling/train-scheduling.service.ts @@ -1207,11 +1207,7 @@ export class TrainSchedulingService { const schedule = await this.getImportDjiboutiSchedule(scheduleId); const operation = await this.getOrCreateImportDjiboutiOperation(scheduleId); this.assertImportDjiboutiGatepassGranted(operation); - if (!operation.loadedOnTrainAt && !(await this.hasLoadedBooking(schedule.id))) { - throw new BadRequestException( - 'Import train cannot depart Djibouti before at least one booking is loaded', - ); - } + // Loading confirmation does not block departure (see assertImportDjiboutiMayDepart). if (schedule.status === TrainScheduleStatusEnum.Scheduled) { await this.dispatchSchedule(schedule.id); @@ -1588,26 +1584,9 @@ export class TrainSchedulingService { where: { trainScheduleId: schedule.id }, }); this.assertImportDjiboutiGatepassGranted(operation); - // A train dispatches once loading is confirmed at the train level OR at least - // one booking on it is marked LOADED — it never waits for every booking. - if (!operation?.loadedOnTrainAt && !(await this.hasLoadedBooking(schedule.id))) { - throw new BadRequestException( - 'Import train cannot depart Djibouti before at least one booking is loaded', - ); - } - } - - /** True when at least one booking on the schedule is confirmed LOADED. */ - private async hasLoadedBooking(scheduleId: string): Promise { - const [row]: Array<{ loaded: string }> = await this.dataSource.query( - `SELECT COUNT(*) AS loaded - FROM freight.train_schedule_bookings - WHERE train_schedule_id = $1 - AND loading_status = $2 - AND deleted_at IS NULL`, - [scheduleId, LoadingStatus.Loaded], - ); - return Number(row?.loaded ?? 0) > 0; + // Loading confirmation does NOT gate dispatch. Per-booking loading is + // tracking only and the loaded-on-train step is optional — a scheduled train + // dispatches without waiting on loading. } private async getImportDjiboutiSchedule(scheduleId: string): Promise {