import { ApiPropertyOptional } from '@nestjs/swagger'; import { Type } from 'class-transformer'; import { IsInt, IsNumber, IsOptional, Max, Min } from 'class-validator'; /** * Per-schedule booking-window rule override (staff action on the ops board). * Every field is optional — only the ones sent are changed; the rest keep the * schedule's existing snapshot. Mirrors the window fields of the global rules DTO. */ export class UpdateScheduleWindowRuleDto { @ApiPropertyOptional({ example: 8, description: 'Local EAT hour the booking desk opens each day' }) @IsOptional() @Type(() => Number) @IsInt() @Min(0) @Max(23) windowOpenHour?: number; @ApiPropertyOptional({ example: 17, description: 'Local EAT hour the booking desk shuts each day; a not-yet-full window resumes next morning at windowOpenHour. Equal to windowOpenHour = 24-hour desk', }) @IsOptional() @Type(() => Number) @IsInt() @Min(0) @Max(23) windowCloseHour?: number; @ApiPropertyOptional({ example: 3, description: 'How long each booking cycle stays open, in hours' }) @IsOptional() @Type(() => Number) @IsNumber() @Min(0.0166) @Max(12) windowDurationHours?: number; @ApiPropertyOptional({ example: 30, description: 'Max staff document-review minutes after the window closes' }) @IsOptional() @Type(() => Number) @IsInt() @Min(0) docReviewMinutes?: number; @ApiPropertyOptional({ example: 60, description: 'Customer payment window minutes' }) @IsOptional() @Type(() => Number) @IsInt() @Min(1) paymentWindowMinutes?: number; @ApiPropertyOptional({ example: 3, description: 'Days before departure the booking window starts (re-derives the window start)', }) @IsOptional() @Type(() => Number) @IsInt() @Min(0) importWindowLeadDays?: number; @ApiPropertyOptional({ example: 24, description: 'Hours before departure the single FCFS export window opens (EXPORT schedules; re-derives the window start)', }) @IsOptional() @Type(() => Number) @IsInt() @Min(1) exportBookingLeadHours?: number; }