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

251 lines
7.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 (02). 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;
}