The batchCheckOut method was not releasing assigned beds and lockers after checkout, leaving them orphaned as 'occupied'. Added the same release pattern used in checkOut() — using runner.manager.update() since batchCheckOut operates inside a QueryRunner transaction.
138 lines
2.5 KiB
TypeScript
138 lines
2.5 KiB
TypeScript
import { IsOptional, IsString, IsNotEmpty, IsInt, IsArray, IsDateString, IsEnum } from 'class-validator';
|
|
import { Type } from 'class-transformer';
|
|
import { ClassType, ClassStatus, TeacherRoleType } from '../../entities';
|
|
|
|
export class CreateClassDto {
|
|
@IsString() @IsNotEmpty()
|
|
name: string;
|
|
|
|
@IsString() @IsNotEmpty()
|
|
code: string;
|
|
|
|
@IsOptional() @IsInt()
|
|
departmentId?: number;
|
|
|
|
@IsEnum(ClassType) @IsString() @IsNotEmpty()
|
|
classType: string;
|
|
|
|
@IsOptional() @IsDateString()
|
|
startDate?: string;
|
|
|
|
@IsOptional() @IsDateString()
|
|
endDate?: string;
|
|
|
|
@IsEnum(ClassStatus) @IsOptional() @IsString()
|
|
status?: string;
|
|
|
|
@IsOptional() @IsInt()
|
|
headTeacherId?: number;
|
|
|
|
@IsOptional() @IsInt()
|
|
lifeTeacherId?: number;
|
|
|
|
@IsOptional() @IsInt()
|
|
academicTeacherId?: number;
|
|
|
|
@IsOptional() @IsInt()
|
|
maxStudents?: number;
|
|
|
|
@IsOptional() @IsString()
|
|
notes?: string;
|
|
|
|
@IsOptional() @IsArray()
|
|
studentIds?: number[];
|
|
|
|
@IsOptional() @IsArray()
|
|
teachers?: Array<{ userId: number; roleType: string; subject?: string }>;
|
|
}
|
|
|
|
export class UpdateClassDto {
|
|
@IsOptional() @IsString()
|
|
name?: string;
|
|
|
|
@IsOptional() @IsString()
|
|
code?: string;
|
|
|
|
@IsOptional() @IsInt()
|
|
departmentId?: number;
|
|
|
|
@IsEnum(ClassType) @IsOptional() @IsString()
|
|
classType?: string;
|
|
|
|
@IsOptional() @IsDateString()
|
|
startDate?: string;
|
|
|
|
@IsOptional() @IsDateString()
|
|
endDate?: string;
|
|
|
|
@IsEnum(ClassStatus) @IsOptional() @IsString()
|
|
status?: string;
|
|
|
|
@IsOptional() @IsInt()
|
|
headTeacherId?: number;
|
|
|
|
@IsOptional() @IsInt()
|
|
lifeTeacherId?: number;
|
|
|
|
@IsOptional() @IsInt()
|
|
academicTeacherId?: number;
|
|
|
|
@IsOptional() @IsInt()
|
|
maxStudents?: number;
|
|
|
|
@IsOptional() @IsString()
|
|
notes?: string;
|
|
}
|
|
|
|
export class QueryClassDto {
|
|
@IsOptional()
|
|
@Type(() => Number)
|
|
@IsInt()
|
|
departmentId?: number;
|
|
|
|
@IsOptional() @IsString()
|
|
status?: string;
|
|
|
|
@IsOptional() @IsString()
|
|
classType?: string;
|
|
|
|
@IsOptional() @IsString()
|
|
keyword?: string;
|
|
|
|
@IsOptional()
|
|
@Type(() => Boolean)
|
|
isArchived?: boolean;
|
|
}
|
|
|
|
export class AddStudentsDto {
|
|
@IsArray() @IsInt({ each: true })
|
|
studentIds: number[];
|
|
}
|
|
|
|
export class AddTeacherDto {
|
|
@IsInt()
|
|
userId: number;
|
|
|
|
@IsEnum(TeacherRoleType)
|
|
roleType: string;
|
|
|
|
@IsOptional() @IsString()
|
|
subject?: string;
|
|
}
|
|
|
|
export class QueryClassScheduleDto {
|
|
@IsOptional() @IsDateString()
|
|
startDate?: string;
|
|
|
|
@IsOptional() @IsDateString()
|
|
endDate?: string;
|
|
}
|
|
|
|
export class QueryClassAttendanceSummaryDto {
|
|
@IsOptional() @IsDateString()
|
|
startDate?: string;
|
|
|
|
@IsOptional() @IsDateString()
|
|
endDate?: string;
|
|
}
|