Files
CRM_Montzar/apps/api/src/reservations/dto.ts
T

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;
}