forked from Yara724/api
251 lines
7.0 KiB
TypeScript
251 lines
7.0 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:
|
||
"V5 only. Number of times the FileMaker has rejected this claim (0–2). When 2, the next action must be approval.",
|
||
example: 1,
|
||
})
|
||
fileMakerRejectionCount?: number;
|
||
|
||
@ApiPropertyOptional({
|
||
description: "V5 only. Reason text from the most recent FileMaker rejection.",
|
||
example: "قیمت نامعقول",
|
||
})
|
||
fileMakerRejectionReason?: string;
|
||
|
||
@ApiPropertyOptional({
|
||
description: "V5 only. ObjectId of the FileMaker who must approve (or has approved) this claim.",
|
||
example: "6a43a2689faee3d20bf24030",
|
||
})
|
||
fileMakerApprovalActorId?: string;
|
||
|
||
@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;
|
||
}
|