import { IsDateString, IsIn, IsInt, IsString, IsNumber, IsOptional, Matches, Min } from 'class-validator'; import { PartialType } from '@nestjs/mapped-types'; import { Type } from 'class-transformer'; export class CreateRoomExpenseDto { @IsInt() roomId: number; @IsString() expenseType: string; @IsNumber({ maxDecimalPlaces: 2 }) @Min(0.01) amount: number; @IsDateString() periodStart: string; @IsDateString() periodEnd: string; @IsOptional() @IsString() description?: string; } export class CreatePersonalExpenseDto { @IsInt() studentId: number; @IsOptional() @IsInt() roomId?: number; @IsString() expenseType: string; @IsNumber({ maxDecimalPlaces: 2 }) @Min(0.01) amount: number; @IsDateString() expenseDate: string; @IsOptional() @IsString() description?: string; } export class UpdateRoomExpenseDto extends PartialType(CreateRoomExpenseDto) {} export class UpdatePersonalExpenseDto extends PartialType(CreatePersonalExpenseDto) {} export class QueryRoomExpenseDto { @IsOptional() @Type(() => Number) @IsInt() roomId?: number; @IsOptional() @IsDateString() periodStart?: string; @IsOptional() @IsDateString() periodEnd?: string; } export class QueryPersonalExpenseDto { @IsOptional() @Type(() => Number) @IsInt() studentId?: number; } export class BatchRoomExpenseDto { @IsString() periodStart: string; @IsString() periodEnd: string; expenses: { roomId: number; expenseType: string; amount: number; description?: string }[]; } export class CreateStudentUtilityBillDto { @IsInt() studentId: number; @IsIn(['water', 'electricity']) expenseType: 'water' | 'electricity'; @IsNumber({ maxDecimalPlaces: 2 }) @Min(0.01) amount: number; @IsString() @Matches(/^\d{4}-\d{2}-\d{2}$/) periodStart: string; @IsString() @Matches(/^\d{4}-\d{2}-\d{2}$/) periodEnd: string; @IsOptional() @IsString() description?: string; }