import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsInt, IsOptional } from 'class-validator'; /** * DTO for required document item */ export class RequiredDocumentItem { @ApiProperty({ description: 'Document key/type', example: 'car_green_card', }) key: string; @ApiProperty({ description: 'Display label in Farsi', example: 'کارت سبز خودرو', }) label_fa: string; @ApiProperty({ description: 'Display label in English', example: 'Car Green Card', }) label_en: string; @ApiProperty({ description: 'Whether this document has been uploaded', example: false, }) uploaded: boolean; @ApiProperty({ description: 'Category of the document', example: 'general', enum: ['general', 'damaged_party', 'guilty_party'], }) category: string; } /** * DTO for car angle item */ export class CarAngleItem { @ApiProperty({ description: 'Angle key', example: 'front', enum: ['front', 'back', 'left', 'right'], }) key: string; @ApiProperty({ description: 'Display label in Farsi', example: 'جلو', }) label_fa: string; @ApiProperty({ description: 'Display label in English', example: 'Front', }) label_en: string; @ApiProperty({ description: 'Whether this angle has been captured', example: false, }) captured: boolean; } /** * DTO for damaged part item */ export class DamagedPartItem { @ApiProperty({ description: 'Side-agnostic part name (matches catalog suffix); use with `side` to disambiguate', example: 'backfender', }) name: string; @ApiPropertyOptional({ description: 'Vehicle side / region (left, right, front, back, top)', example: 'left', }) side?: string; @ApiProperty({ description: 'Display label in Farsi', example: 'کاپوت', }) label_fa: string; @ApiPropertyOptional({ description: 'Deprecated: same as `name` (kept for older clients)', example: 'backfender', }) key?: string; @ApiProperty({ description: 'Display label in English', example: 'Hood', }) label_en: string; @ApiProperty({ description: 'Whether this part has been captured', example: false, }) captured: boolean; /** Static catalog id (same as `damagedParts[].id` in capture requirements) when the part comes from the outer-parts catalog. */ @ApiPropertyOptional({ example: 12 }) @IsOptional() @IsInt() id?: number; } /** * Response DTO for capture requirements V2 */ export class GetCaptureRequirementsV2ResponseDto { @ApiProperty({ description: 'Claim request ID', example: '507f1f77bcf86cd799439011', }) claimRequestId: string; @ApiProperty({ description: 'Public ID', example: 'A14235', }) publicId: string; @ApiProperty({ description: 'Current workflow step', example: 'UPLOAD_REQUIRED_DOCUMENTS', }) currentStep: string; @ApiProperty({ description: 'List of required documents to upload', type: [RequiredDocumentItem], }) requiredDocuments: RequiredDocumentItem[]; @ApiProperty({ description: 'List of car angles to capture', type: [CarAngleItem], }) carAngles: CarAngleItem[]; @ApiProperty({ description: 'List of damaged parts to capture', type: [DamagedPartItem], }) damagedParts: DamagedPartItem[]; @ApiProperty({ description: 'Total number of items remaining', example: 18, }) totalRemaining: number; @ApiProperty({ description: 'Summary of progress', example: { documentsUploaded: 2, documentsTotal: 13, anglesCapture: 0, anglesTotal: 4, partsCapture: 0, partsTotal: 3, }, }) progress: { documentsUploaded: number; documentsTotal: number; anglesCaptured: number; anglesTotal: number; partsCaptured: number; partsTotal: number; }; }