mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-27 00:52:50 +00:00
dispatchSchedule guarded status, Djibouti departure rules, locomotives and wagons — but never checked the cargo. A train could be dispatched while the bookings allocated to it sat received in the warehouse, silently leaving them behind. Dispatch now refuses when an allocated booking has warehouse inventory in RECEIVED/STORED/READY_FOR_LOADING, naming the bookings and pointing at the two ways out: load them, or drop the wagon allocation so they ride a later train. Bookings with no inventory at all are not blocked — allocating a wagon before the goods arrive is normal planning. Also drops RESERVED from the Load-to-Train filters: reserved stock is not awaiting loading. The sched_bookings CTE moves to common/schedule-bookings.sql so the warehouse loading queue and this dispatch guard resolve a train's bookings identically — if they drift, a train departs leaving cargo the warehouse still expects to load. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
29 lines
1.3 KiB
TypeScript
29 lines
1.3 KiB
TypeScript
/**
|
|
* SQL CTE resolving the bookings riding a train schedule, as `sched_bookings
|
|
* (schedule_id, booking_id)`. Use as: `WITH ${SCHEDULE_BOOKINGS_CTE} SELECT ...`.
|
|
*
|
|
* A booking reaches a train through WAGON ALLOCATION
|
|
* (train_schedules -> train_sets -> train_set_wagons -> wagon_booking_allocations),
|
|
* which is what the allocation UI writes. `train_schedule_bookings` is only ever
|
|
* written by the demo seeders, so both sources are unioned: real allocations work
|
|
* and the seeded scenarios keep working.
|
|
*
|
|
* Shared so the warehouse loading queue and the train dispatch guard agree on
|
|
* exactly which bookings are on a train — if they drift, a train can be
|
|
* dispatched leaving cargo the warehouse still thinks it should load.
|
|
*/
|
|
export const SCHEDULE_BOOKINGS_CTE = `
|
|
sched_bookings AS (
|
|
SELECT ts.id AS schedule_id, wba.booking_id
|
|
FROM freight.train_schedules ts
|
|
JOIN freight.train_set_wagons tsw
|
|
ON tsw.train_set_id = ts.train_set_id AND tsw.deleted_at IS NULL
|
|
JOIN freight.wagon_booking_allocations wba
|
|
ON wba.train_set_wagon_id = tsw.id AND wba.deleted_at IS NULL
|
|
WHERE ts.deleted_at IS NULL
|
|
UNION
|
|
SELECT tsb.train_schedule_id, tsb.booking_id
|
|
FROM freight.train_schedule_bookings tsb
|
|
WHERE tsb.deleted_at IS NULL
|
|
)`;
|