Files
bigcapital/packages/server/src/modules/Expenses/dtos/Expense.dto.ts
2025-10-28 18:12:08 +02:00

190 lines
3.8 KiB
TypeScript

import { ToNumber } from '@/common/decorators/Validators';
import { parseBoolean } from '@/utils/parse-boolean';
import { ApiProperty } from '@nestjs/swagger';
import { Transform, Type } from 'class-transformer';
import {
IsArray,
IsBoolean,
IsDateString,
IsInt,
IsISO4217CurrencyCode,
IsNotEmpty,
IsNumber,
IsOptional,
IsString,
MaxLength,
ValidateNested,
} from 'class-validator';
class AttachmentDto {
@IsString()
key: string;
}
export class ExpenseCategoryDto {
@IsInt()
@IsNotEmpty()
@ApiProperty({ example: 1, description: 'The index of the expense category' })
index: number;
@IsNotEmpty()
@ToNumber()
@IsInt()
@ApiProperty({
example: 1,
description: 'The expense account id of the expense category',
})
expenseAccountId: number;
@ToNumber()
@IsNumber()
@IsOptional()
@ApiProperty({
example: 100,
description: 'The amount of the expense category',
})
amount?: number;
@IsString()
@MaxLength(255)
@IsOptional()
@ApiProperty({
example: 'This is a description',
description: 'The description of the expense category',
})
description?: string;
@IsBoolean()
@Transform(({ value }) => parseBoolean(value, false))
@IsOptional()
@ApiProperty({
example: true,
description: 'The landed cost of the expense category',
})
landedCost?: boolean;
@ToNumber()
@IsInt()
@IsOptional()
@ApiProperty({
example: 1,
description: 'The project id of the expense category',
})
projectId?: number;
}
export class CommandExpenseDto {
@IsString()
@MaxLength(255)
@IsOptional()
@ApiProperty({
description: 'The reference number of the expense',
example: 'INV-123456',
})
referenceNo?: string;
@IsDateString()
@IsNotEmpty()
@ApiProperty({
description: 'The payment date of the expense',
example: '2021-01-01',
})
paymentDate: Date;
@IsNotEmpty()
@ToNumber()
@IsInt()
@ApiProperty({
description: 'The payment account id of the expense',
example: 1,
})
paymentAccountId: number;
@IsString()
@MaxLength(1000)
@IsOptional()
@ApiProperty({
description: 'The description of the expense',
example: 'This is a description',
})
description?: string;
@ToNumber()
@IsNumber()
@IsOptional()
@ApiProperty({ description: 'The exchange rate of the expense', example: 1 })
exchangeRate?: number;
@IsString()
@MaxLength(3)
@IsOptional()
@IsISO4217CurrencyCode()
@ApiProperty({
description: 'The currency code of the expense',
example: 'USD',
})
currencyCode?: string;
@IsBoolean()
@Transform(({ value }) => parseBoolean(value, false))
@IsOptional()
@ApiProperty({
description: 'The publish status of the expense',
example: true,
})
publish?: boolean;
@IsOptional()
@ToNumber()
@IsInt()
@ApiProperty({
description: 'The payee id of the expense',
example: 1,
})
payeeId?: number;
@ToNumber()
@IsInt()
@IsOptional()
@ApiProperty({
description: 'The branch id of the expense',
example: 1,
})
branchId?: number;
@IsArray()
@ValidateNested({ each: true })
@Type(() => ExpenseCategoryDto)
@ApiProperty({
description: 'The categories of the expense',
example: [
{
index: 1,
expenseAccountId: 1,
amount: 100,
description: 'This is a description',
landedCost: true,
projectId: 1,
},
],
})
categories: ExpenseCategoryDto[];
@IsArray()
@ValidateNested({ each: true })
@Type(() => AttachmentDto)
@IsOptional()
@ApiProperty({
description: 'The attachments of the expense',
example: [
{
key: '123456',
},
],
})
attachments?: AttachmentDto[];
}
export class CreateExpenseDto extends CommandExpenseDto { }
export class EditExpenseDto extends CommandExpenseDto { }