Files
yara724api/src/expert-claim/dto/claim-detail-v2.dto.ts
2026-07-14 14:30:41 +03:30

232 lines
6.4 KiB
TypeScript

import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
import { BlameRequestType } from "src/Types&Enums/blame-request-management/blameRequestType.enum";
import { DamageSelectedPartV2BodyDto } from "src/claim-request-management/dto/damage-selected-part-v2.dto";
export class ClaimDetailV2ResponseDto {
@ApiProperty()
claimRequestId: string;
@ApiProperty()
publicId: string;
@ApiProperty()
status: string;
@ApiProperty()
claimStatus: string;
@ApiProperty()
currentStep: string;
@ApiPropertyOptional()
nextStep?: string;
@ApiProperty({ description: "Whether claim is locked" })
locked: boolean;
@ApiPropertyOptional()
lockedBy?: {
actorId: string;
actorName: string;
lockedAt: string;
expiredAt?: string;
};
@ApiPropertyOptional()
owner?: {
userId: string;
fullName?: string;
};
@ApiPropertyOptional()
vehicle?: {
carName?: string;
carModel?: string;
carType?: string;
plate?: any;
};
@ApiPropertyOptional({
description: "Blame file type from linked blame case",
enum: BlameRequestType,
})
blameRequestType?: BlameRequestType;
@ApiPropertyOptional({
description:
"CAR_BODY only: first-step flags — another car (`car`) and/or object (`object`)",
example: { car: true, object: false },
})
carBodyFirstForm?: { car?: boolean; object?: boolean };
@ApiPropertyOptional({ description: "Blame request ID", example: "507f..." })
blameRequestId?: string;
@ApiPropertyOptional({
description: "Blame request number",
example: "BL12345",
})
blameRequestNo?: string;
@ApiPropertyOptional({
description: "Selected outer damaged parts (id, name, side, label_fa)",
type: [DamageSelectedPartV2BodyDto],
})
selectedParts?: DamageSelectedPartV2BodyDto[];
@ApiPropertyOptional({ description: "Selected other damaged parts" })
otherParts?: string[];
@ApiPropertyOptional({ description: "Required documents status" })
requiredDocuments?: Record<
string,
{
uploaded: boolean;
fileId?: string;
fileName?: string;
filePath?: string;
}
>;
@ApiPropertyOptional({ description: "Car angles captured" })
carAngles?: Record<string, { captured: boolean; url?: string }>;
@ApiPropertyOptional({
description:
"Per-part captures (array index matches selectedParts; includes id, name, side, label_fa, captured, url)",
type: "array",
items: {
type: "object",
properties: {
index: { type: "number" },
partId: {
type: "number",
nullable: true,
description:
"Numeric catalog part id for outer parts (`null` for non-catalog lines); use in reply/submit and price-drop",
},
id: { type: "number", nullable: true },
name: { type: "string" },
side: { type: "string" },
label_fa: { type: "string" },
captured: { type: "boolean" },
url: { type: "string" },
},
},
})
damagedParts?: Array<{
index: number;
partId: number | null;
id?: number | null;
name: string;
side: string;
label_fa: string;
captured: boolean;
url?: string;
}>;
@ApiPropertyOptional({
description:
"True when user uploaded all required factors and the case awaits expert approve/reject.",
})
awaitingFactorValidation?: boolean;
@ApiPropertyOptional({
description:
"True for V5 files — the FileMaker must approve or reject the claim before it is submitted to fanavaran. False (or absent) for V4 files which go straight through.",
example: true,
})
requiresFileMakerApproval?: boolean;
@ApiPropertyOptional({
description:
"Slice of `claim.evaluation` exposed to the damage expert. " +
"`damageExpertReply` / `damageExpertReplyFinal` are returned whenever " +
"present, regardless of the current claim status — historical assessment " +
"data remains visible once the expert has submitted it. " +
"`ownerInsurerApproval` and `ownerPricedPartsApproval` are returned " +
"whenever they exist on the claim — each carries `signLink` (resolved " +
"from `signDetailId`) so the front-end can render the user signature " +
"directly. Likewise, `damageExpertReply.userComment` / " +
"`damageExpertReplyFinal.userComment` expose `signLink` when a user " +
"comment signature is present. `priceDrop` is included whenever it " +
"has been saved, not only during the expert review phase.",
})
evaluation?: {
damageExpertReply?: unknown;
damageExpertReplyFinal?: unknown;
damageExpertResend: unknown;
ownerInsurerApproval?: {
agree: boolean;
branchId?: string;
signDetailId?: string;
signLink?: string;
signedAt?: Date | string;
};
ownerPricedPartsApproval?: {
agree: boolean;
branchId?: string;
signDetailId?: string;
signLink?: string;
signedAt?: Date | string;
};
priceDrop?: {
total?: number;
carPrice?: number;
carModel?: number;
carValue?: number[];
sumOfSeverity?: number;
coefficientYear?: number;
partLines?: Array<Record<string, unknown>>;
};
};
@ApiPropertyOptional({
description:
"Owner objection to expert-priced parts (`evaluation.objection`): disputed lines + optional new parts + submission time.",
})
objection?: {
objectionParts?: Array<Record<string, unknown>>;
newParts?: Array<Record<string, unknown>>;
submittedAt?: Date | string;
};
@ApiPropertyOptional({
description:
"Car walk-around video from `claim-video-capture` (resolved from `media.videoCaptureId`).",
})
videoCapture?: {
id: string;
url?: string;
path?: string;
fileName?: string;
};
@ApiPropertyOptional({
description:
"Linked blame case (`blameCases`), same shape as expert-blame detail: parties with video/voice URLs, workflow, expert, formatted dates.",
})
blameCase?: Record<string, unknown>;
@ApiPropertyOptional({
description:
"Same as `blameCase.expert.decision` when present: guilty party id, description, accident fields, decidedAt.",
})
blameExpertDecision?: Record<string, unknown>;
@ApiPropertyOptional({
description:
"Claim payout / banking metadata from the claim file (e.g. Sheba).",
})
money?: {
sheba?: string;
nationalCodeOfInsurer?: string;
};
@ApiProperty()
createdAt: string;
@ApiProperty()
updatedAt: string;
}