/** * Booking-window timings sourced from the train_scheduling_global_rules singleton, * with hardcoded fallbacks when the row is missing (see TrainSchedulingService.getWindowConfig). */ export interface BookingWindowConfig { /** Days before departure the single import booking-window day falls on. */ importWindowLeadDays: number; /** Hours before departure an export booking becomes acceptable (FCFS). */ exportBookingLeadHours: number; /** Local (Africa/Addis_Ababa) hour at which the import window opens each day. */ windowOpenHour: number; /** * Local (Africa/Addis_Ababa) hour the booking desk shuts for the day: once a * cycle's reopen would fall at/after this hour, the window pauses and resumes * next morning at windowOpenHour. Equal to windowOpenHour ⇒ 24-hour desk. */ windowCloseHour: number; windowDurationHours: number; /** Max staff document-review time after the window closes. */ docReviewMinutes: number; paymentWindowMinutes: number; /** Delay after window close before reopening when the train is not full. */ reopenDelayMinutes: number; } /** Window phase lifecycle for the one-booking-day import cycle. NULL on legacy/DOMESTIC schedules. */ export const WINDOW_PHASES = [ 'PRE_WINDOW', 'OPEN', 'DOC_REVIEW', 'PAYMENT', 'CLOSED_FOR_DAY', 'DONE', ] as const; export type WindowPhase = (typeof WINDOW_PHASES)[number];