import { IsString, IsOptional, IsEnum, IsNumber, IsBoolean, IsArray, ValidateNested, Min, Max, IsUUID, } from 'class-validator'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Type } from 'class-transformer'; import { SchemeType, AppliesTo, TierConfig } from '../entities/commission-scheme.entity'; export class TierConfigDto { @ApiProperty({ description: 'Tier lower bound (inclusive)' }) @IsNumber() @Min(0) from: number; @ApiPropertyOptional({ description: 'Tier upper bound (exclusive), null for unlimited' }) @IsOptional() @IsNumber() @Min(0) to: number | null; @ApiProperty({ description: 'Commission rate for this tier (0-100)' }) @IsNumber() @Min(0) @Max(100) rate: number; } export class CreateSchemeDto { @ApiProperty({ description: 'Scheme name' }) @IsString() name: string; @ApiPropertyOptional({ description: 'Scheme description' }) @IsOptional() @IsString() description?: string; @ApiProperty({ enum: SchemeType, description: 'Commission calculation type', default: SchemeType.PERCENTAGE }) @IsEnum(SchemeType) type: SchemeType; @ApiPropertyOptional({ description: 'Commission rate for percentage type (0-100)', default: 0 }) @IsOptional() @IsNumber() @Min(0) @Max(100) rate?: number; @ApiPropertyOptional({ description: 'Fixed commission amount', default: 0 }) @IsOptional() @IsNumber() @Min(0) fixed_amount?: number; @ApiPropertyOptional({ description: 'Tier configurations for tiered type', type: [TierConfigDto] }) @IsOptional() @IsArray() @ValidateNested({ each: true }) @Type(() => TierConfigDto) tiers?: TierConfig[]; @ApiPropertyOptional({ enum: AppliesTo, description: 'What the commission applies to', default: AppliesTo.ALL }) @IsOptional() @IsEnum(AppliesTo) applies_to?: AppliesTo; @ApiPropertyOptional({ description: 'Product IDs when applies_to is "products"', type: [String] }) @IsOptional() @IsArray() @IsUUID('4', { each: true }) product_ids?: string[]; @ApiPropertyOptional({ description: 'Category IDs when applies_to is "categories"', type: [String] }) @IsOptional() @IsArray() @IsUUID('4', { each: true }) category_ids?: string[]; @ApiPropertyOptional({ description: 'Minimum sale amount to qualify for commission', default: 0 }) @IsOptional() @IsNumber() @Min(0) min_amount?: number; @ApiPropertyOptional({ description: 'Maximum commission per sale (cap)' }) @IsOptional() @IsNumber() @Min(0) max_amount?: number; @ApiPropertyOptional({ description: 'Whether the scheme is active', default: true }) @IsOptional() @IsBoolean() is_active?: boolean; }