Files
gongxue-base/apps/server/src/expenses/dto/expense.dto.ts

111 lines
1.9 KiB
TypeScript

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