206 lines
3.0 KiB
TypeScript
206 lines
3.0 KiB
TypeScript
import { Type } from 'class-transformer';
|
|
import {
|
|
ArrayMaxSize,
|
|
IsArray,
|
|
IsBoolean,
|
|
IsDateString,
|
|
IsIn,
|
|
IsInt,
|
|
IsOptional,
|
|
IsString,
|
|
Max,
|
|
MaxLength,
|
|
Min,
|
|
MinLength,
|
|
} from 'class-validator';
|
|
|
|
const STATUSES = ['pending', 'confirmed', 'canceled', 'done'] as const;
|
|
|
|
export class CreateReservationServiceDto {
|
|
@IsString()
|
|
@MinLength(2)
|
|
@MaxLength(120)
|
|
name!: string;
|
|
|
|
@IsOptional()
|
|
@IsString()
|
|
@MaxLength(500)
|
|
description?: string;
|
|
|
|
@Type(() => Number)
|
|
@IsInt()
|
|
@Min(5)
|
|
@Max(480)
|
|
durationMinutes!: number;
|
|
|
|
@IsOptional()
|
|
@IsArray()
|
|
@ArrayMaxSize(7)
|
|
@IsInt({ each: true })
|
|
@Min(0, { each: true })
|
|
@Max(6, { each: true })
|
|
workDays?: number[];
|
|
|
|
@IsOptional()
|
|
@Type(() => Number)
|
|
@IsInt()
|
|
@Min(0)
|
|
@Max(23)
|
|
dayStartHour?: number;
|
|
|
|
@IsOptional()
|
|
@Type(() => Number)
|
|
@IsInt()
|
|
@Min(1)
|
|
@Max(24)
|
|
dayEndHour?: number;
|
|
|
|
@IsOptional()
|
|
@IsBoolean()
|
|
isActive?: boolean;
|
|
}
|
|
|
|
export class UpdateReservationServiceDto {
|
|
@IsOptional()
|
|
@IsString()
|
|
@MinLength(2)
|
|
@MaxLength(120)
|
|
name?: string;
|
|
|
|
@IsOptional()
|
|
@IsString()
|
|
@MaxLength(500)
|
|
description?: string;
|
|
|
|
@IsOptional()
|
|
@Type(() => Number)
|
|
@IsInt()
|
|
@Min(5)
|
|
@Max(480)
|
|
durationMinutes?: number;
|
|
|
|
@IsOptional()
|
|
@IsArray()
|
|
@ArrayMaxSize(7)
|
|
@IsInt({ each: true })
|
|
@Min(0, { each: true })
|
|
@Max(6, { each: true })
|
|
workDays?: number[];
|
|
|
|
@IsOptional()
|
|
@Type(() => Number)
|
|
@IsInt()
|
|
@Min(0)
|
|
@Max(23)
|
|
dayStartHour?: number;
|
|
|
|
@IsOptional()
|
|
@Type(() => Number)
|
|
@IsInt()
|
|
@Min(1)
|
|
@Max(24)
|
|
dayEndHour?: number;
|
|
|
|
@IsOptional()
|
|
@IsBoolean()
|
|
isActive?: boolean;
|
|
}
|
|
|
|
export class CreateReservationAppointmentDto {
|
|
@IsString()
|
|
serviceId!: string;
|
|
|
|
@IsString()
|
|
personId!: string;
|
|
|
|
@IsOptional()
|
|
@IsString()
|
|
assigneeId?: string | null;
|
|
|
|
@IsDateString()
|
|
startsAt!: string;
|
|
|
|
@IsOptional()
|
|
@IsIn(STATUSES)
|
|
status?: (typeof STATUSES)[number];
|
|
|
|
@IsOptional()
|
|
@IsString()
|
|
@MaxLength(1000)
|
|
notes?: string | null;
|
|
}
|
|
|
|
export class UpdateReservationAppointmentDto {
|
|
@IsOptional()
|
|
@IsString()
|
|
serviceId?: string;
|
|
|
|
@IsOptional()
|
|
@IsString()
|
|
personId?: string;
|
|
|
|
@IsOptional()
|
|
@IsString()
|
|
assigneeId?: string | null;
|
|
|
|
@IsOptional()
|
|
@IsDateString()
|
|
startsAt?: string;
|
|
|
|
@IsOptional()
|
|
@IsIn(STATUSES)
|
|
status?: (typeof STATUSES)[number];
|
|
|
|
@IsOptional()
|
|
@IsString()
|
|
@MaxLength(1000)
|
|
notes?: string | null;
|
|
}
|
|
|
|
export class ListReservationsQueryDto {
|
|
@IsOptional()
|
|
@IsIn(STATUSES)
|
|
status?: (typeof STATUSES)[number];
|
|
|
|
@IsOptional()
|
|
@IsDateString()
|
|
from?: string;
|
|
|
|
@IsOptional()
|
|
@IsDateString()
|
|
to?: string;
|
|
|
|
@IsOptional()
|
|
@IsString()
|
|
serviceId?: string;
|
|
|
|
@IsOptional()
|
|
@IsString()
|
|
personId?: string;
|
|
|
|
@IsOptional()
|
|
@Type(() => Number)
|
|
@IsInt()
|
|
@Min(1)
|
|
page?: number = 1;
|
|
|
|
@IsOptional()
|
|
@Type(() => Number)
|
|
@IsInt()
|
|
@Min(1)
|
|
@Max(100)
|
|
limit?: number = 30;
|
|
}
|
|
|
|
export class SlotsQueryDto {
|
|
@IsString()
|
|
serviceId!: string;
|
|
|
|
@IsDateString()
|
|
date!: string;
|
|
|
|
@IsOptional()
|
|
@IsString()
|
|
assigneeId?: string;
|
|
}
|