import { ApiProperty, PartialType } from '@nestjs/swagger' import { Type } from 'class-transformer' import { ArrayMinSize, IsBoolean, IsDate, IsDateString, IsEnum, IsNotEmpty, IsNumber, IsObject, IsOptional, IsString, Min, ValidateNested, } from 'class-validator' import type { CustomerIndividual, CustomerLegal } from 'generated/prisma/client' import { CustomerType } from 'generated/prisma/enums' import { CreateSalesInvoiceItemDto } from '../sales-invoice-items/dto/create-sales-invoice-item.dto' export class CreateTerminalPayment { @IsOptional() @IsNumber() @Min(0) @ApiProperty({ required: false, default: 0 }) amount?: number @IsString() @IsNotEmpty() @ApiProperty({ required: true }) terminalId: string @IsString() @IsNotEmpty() @ApiProperty({ required: true }) stan: string @IsString() @IsNotEmpty() @ApiProperty({ required: true }) rrn: string @IsString() @IsOptional() @ApiProperty({ required: true }) response_code?: string @IsString() @IsOptional() @ApiProperty({ required: true }) customer_card_no?: string @Type(() => Date) @IsDate() @ApiProperty({ required: true }) transaction_date_time: Date @IsOptional() @IsString() @ApiProperty({ required: false }) description?: string } export class CreateSalesInvoicePaymentsDto { @IsOptional() @ValidateNested() @Type(() => CreateTerminalPayment) @ApiProperty({ required: false, type: () => CreateTerminalPayment }) terminals?: CreateTerminalPayment @IsOptional() @IsNumber() @Min(0) @ApiProperty({ required: false, default: 0 }) cash?: number @IsOptional() @IsNumber() @Min(0) @ApiProperty({ required: false, default: 0 }) set_off?: number @IsOptional() @IsNumber() @Min(0) @ApiProperty({ required: false, default: 0 }) card?: number @IsOptional() @IsNumber() @Min(0) @ApiProperty({ required: false, default: 0 }) bank?: number @IsOptional() @IsNumber() @Min(0) @ApiProperty({ required: false, default: 0 }) check?: number @IsOptional() @IsNumber() @Min(0) @ApiProperty({ required: false, default: 0 }) other?: number } export class CreateSalesInvoiceDto { // @TODO: totalAmount must calculated instead of get from api @IsNumber() @ApiProperty({ required: true, default: 0 }) total_amount: number @ApiProperty({ required: true }) @IsDateString( { strict: true }, { message: 'invoice_date must be a valid ISO-8601 string' }, ) invoice_date: Date @ApiProperty({ required: true }) @IsObject() @ValidateNested() @Type(() => CreateSalesInvoicePaymentsDto) payments: CreateSalesInvoicePaymentsDto @ApiProperty() @ArrayMinSize(1) items: CreateSalesInvoiceItemDto[] @ApiProperty({ required: false }) @IsOptional() @IsString() notes?: string @ApiProperty({ required: false, default: false }) @IsOptional() @IsBoolean() send_to_tsp?: boolean @ApiProperty({ required: true, default: CustomerType.UNKNOWN }) @IsEnum(CustomerType) customer_type: CustomerType @IsOptional() @IsString() @ApiProperty({ required: false }) customer_id?: string @ApiProperty({ required: false }) @IsOptional() @IsObject() customer?: { customer_individual?: Omit customer_legal?: Omit customer_unknown?: { first_name: string last_name: string } } } export class UpdateSalesInvoiceDto extends PartialType(CreateSalesInvoiceDto) {}