forked from Yara724/api
361 lines
12 KiB
TypeScript
361 lines
12 KiB
TypeScript
import { buildInsurerFileReport } from "./case-expert-report.builder";
|
||
import { PR } from "./persian-report-labels";
|
||
|
||
describe("buildInsurerFileReport", () => {
|
||
const getFieldValue = (
|
||
report: ReturnType<typeof buildInsurerFileReport>,
|
||
sectionTitle: string,
|
||
fieldLabel: string,
|
||
) => {
|
||
const section = report.sections.find((item) => item.title === sectionTitle);
|
||
expect(section).toBeDefined();
|
||
const field = section?.fields.find((item) => item.label === fieldLabel);
|
||
expect(field).toBeDefined();
|
||
return field?.value;
|
||
};
|
||
|
||
it("separates insurance blocks and exposes Fanavaran/timeline/evaluation data", () => {
|
||
const fileCreatedAt = new Date("2026-08-10T09:53:23.588Z");
|
||
const evaluationSubmittedAt = new Date("2026-08-10T12:30:45.000Z");
|
||
|
||
const report = buildInsurerFileReport({
|
||
overview: {
|
||
publicId: "A00010",
|
||
requestNo: "REQ-10",
|
||
createdAt: fileCreatedAt,
|
||
},
|
||
blame: {
|
||
type: "THIRD_PARTY",
|
||
blameStatus: "AGREED",
|
||
createdAt: fileCreatedAt,
|
||
parties: [
|
||
{
|
||
role: "FIRST",
|
||
person: {
|
||
userId: "guilty-user-id",
|
||
fullName: "مقصر نمونه",
|
||
phoneNumber: "09120000000",
|
||
nationalCodeOfInsurer: "0987654321",
|
||
insurerBirthday: 13650115,
|
||
clientId: "client-guilty",
|
||
},
|
||
statement: {
|
||
admitsGuilt: true,
|
||
acceptsExpertOpinion: true,
|
||
description: "توضیحات مقصر",
|
||
},
|
||
vehicle: {
|
||
carName: "206",
|
||
carModel: "1401",
|
||
plate: {
|
||
leftDigits: 98,
|
||
centerAlphabet: "ج",
|
||
centerDigits: 765,
|
||
ir: 22,
|
||
},
|
||
},
|
||
insurance: {
|
||
policyNumber: "TP-GUILTY-001",
|
||
company: "بیمه ثالث مقصر",
|
||
startDate: "1405/01/01",
|
||
endDate: "1406/01/01",
|
||
financialCeiling: "900000000",
|
||
carBodyInsurance: {
|
||
policyNumber: "CB-GUILTY-001",
|
||
insurerCompany: "بیمه بدنه مقصر",
|
||
startDate: "1405/02/01",
|
||
endDate: "1406/02/01",
|
||
},
|
||
},
|
||
},
|
||
{
|
||
role: "SECOND",
|
||
person: {
|
||
userId: "damaged-user-id",
|
||
fullName: "زیان دیده نمونه",
|
||
phoneNumber: "09121111111",
|
||
nationalCodeOfInsurer: "1234567890",
|
||
clientId: "client-damaged",
|
||
insurerBirthday: 13700101,
|
||
},
|
||
statement: {
|
||
claimsDamage: true,
|
||
acceptsExpertOpinion: false,
|
||
description: "توضیحات زیاندیده",
|
||
accidentDate: "2026-08-10",
|
||
accidentTime: "13:23",
|
||
},
|
||
insurance: {
|
||
policyNumber: "TP-DAMAGED-001",
|
||
company: "بیمه ثالث زیاندیده",
|
||
startDate: "1405/03/01",
|
||
endDate: "1406/03/01",
|
||
financialCeiling: "700000000",
|
||
carBodyInsurance: {
|
||
policyNumber: "CB-DAMAGED-001",
|
||
insurerCompany: "بیمه بدنه زیاندیده",
|
||
startDate: "1405/04/01",
|
||
endDate: "1406/04/01",
|
||
coverages: ["سرقت", "آتشسوزی"],
|
||
},
|
||
},
|
||
vehicle: {
|
||
carName: "207",
|
||
carModel: "1402",
|
||
plate: {
|
||
leftDigits: 12,
|
||
centerAlphabet: "ب",
|
||
centerDigits: 345,
|
||
ir: 11,
|
||
},
|
||
},
|
||
},
|
||
],
|
||
expert: {
|
||
decision: {
|
||
guiltyPartyId: "guilty-user-id",
|
||
description: "مقصر شناخته شد",
|
||
fields: {
|
||
accidentWay: { label: "از جلو" },
|
||
accidentReason: { label: "عدم رعایت فاصله" },
|
||
accidentType: { label: "برخورد" },
|
||
},
|
||
},
|
||
},
|
||
},
|
||
claim: {
|
||
claimStatus: "APPROVED",
|
||
claimNo: 111,
|
||
claimId: 222,
|
||
dmgCaseId: 333,
|
||
expertiseId: 444,
|
||
owner: { fullName: "زیان دیده نمونه" },
|
||
vehicle: {
|
||
carName: "207",
|
||
carModel: "1402",
|
||
carType: "sedan",
|
||
},
|
||
fanavaranSync: {
|
||
baseClaim: {
|
||
policyId: 555,
|
||
driverId: 666,
|
||
vehicleKindId: 777,
|
||
insuranceCorpId: 888,
|
||
},
|
||
},
|
||
evaluation: {
|
||
damageExpertReplyFinal: {
|
||
submittedAt: evaluationSubmittedAt,
|
||
description: "نیاز به تعویض سپر جلو",
|
||
actorDetail: { actorName: "کارشناس خسارت نمونه" },
|
||
parts: [
|
||
{
|
||
partId: 12,
|
||
carPartDamage: { label_fa: "سپر جلو" },
|
||
typeOfDamage: "تعویض",
|
||
price: 2_500_000,
|
||
salary: 500_000,
|
||
totalPayment: 3_000_000,
|
||
factorNeeded: false,
|
||
daghi: { option: "تحویل داغی" },
|
||
},
|
||
],
|
||
},
|
||
},
|
||
},
|
||
});
|
||
|
||
expect(getFieldValue(report, PR.ownerSection, PR.name)).toBe("زیان دیده نمونه");
|
||
expect(getFieldValue(report, PR.guiltyOwnerSection, PR.name)).toBe("مقصر نمونه");
|
||
expect(getFieldValue(report, PR.guiltyOwnerSection, PR.phone)).toBe("09120000000");
|
||
expect(getFieldValue(report, PR.guiltyOwnerSection, PR.nationalCode)).toBe(
|
||
"0987654321",
|
||
);
|
||
|
||
expect(getFieldValue(report, PR.damagedThirdPartyInsuranceSection, PR.policyNumber)).toBe(
|
||
"TP-DAMAGED-001",
|
||
);
|
||
expect(getFieldValue(report, PR.guiltyThirdPartyInsuranceSection, PR.policyNumber)).toBe(
|
||
"TP-GUILTY-001",
|
||
);
|
||
expect(getFieldValue(report, PR.damagedCarBodyInsuranceSection, PR.policyNumber)).toBe(
|
||
"CB-DAMAGED-001",
|
||
);
|
||
expect(getFieldValue(report, PR.guiltyCarBodyInsuranceSection, PR.policyNumber)).toBe(
|
||
"CB-GUILTY-001",
|
||
);
|
||
|
||
expect(getFieldValue(report, PR.damagedVehicleSection, "خودرو / نام خودرو")).toBe(
|
||
"207",
|
||
);
|
||
expect(getFieldValue(report, PR.guiltyVehicleSection, "خودرو / نام خودرو")).toBe(
|
||
"206",
|
||
);
|
||
|
||
expect(getFieldValue(report, PR.damagedStatementSection, PR.partyDescription)).toBe(
|
||
"توضیحات زیاندیده",
|
||
);
|
||
expect(getFieldValue(report, PR.damagedStatementSection, PR.claimsDamage)).toBe(
|
||
"بله",
|
||
);
|
||
expect(
|
||
getFieldValue(report, PR.damagedStatementSection, PR.acceptsExpertOpinion),
|
||
).toBe("خیر");
|
||
expect(getFieldValue(report, PR.guiltyStatementSection, PR.partyDescription)).toBe(
|
||
"توضیحات مقصر",
|
||
);
|
||
expect(getFieldValue(report, PR.guiltyStatementSection, PR.admitsGuilt)).toBe(
|
||
"بله",
|
||
);
|
||
expect(
|
||
getFieldValue(report, PR.guiltyStatementSection, PR.acceptsExpertOpinion),
|
||
).toBe("بله");
|
||
|
||
expect(getFieldValue(report, PR.fanavaranSection, PR.fanavaranClaimNo)).toBe(
|
||
"111",
|
||
);
|
||
expect(
|
||
getFieldValue(report, PR.fanavaranSection, PR.fanavaranExpertiseId),
|
||
).toBe("444");
|
||
expect(getFieldValue(report, PR.fanavaranSection, PR.fanavaranPolicyId)).toBe(
|
||
"555",
|
||
);
|
||
|
||
expect(getFieldValue(report, PR.timelineSection, PR.fileRegisteredAt)).toBe(
|
||
"1405/05/19 13:23",
|
||
);
|
||
expect(
|
||
getFieldValue(report, PR.timelineSection, PR.evaluationRegisteredAt),
|
||
).toBe("1405/05/19 16:00");
|
||
|
||
expect(getFieldValue(report, PR.evaluationSection, PR.evaluationResult)).toBe(
|
||
"تأیید شده",
|
||
);
|
||
expect(getFieldValue(report, PR.evaluationSection, PR.evaluationExpert)).toBe(
|
||
"کارشناس خسارت نمونه",
|
||
);
|
||
expect(getFieldValue(report, PR.evaluationSection, PR.evaluationResponse)).toBe(
|
||
"نیاز به تعویض سپر جلو",
|
||
);
|
||
expect(getFieldValue(report, "قیمت قطعات", "قطعه ۱ / نام قطعه")).toBe(
|
||
"سپر جلو",
|
||
);
|
||
expect(getFieldValue(report, "قیمت قطعات", "قطعه ۱ / قیمت قطعه")).toBe(
|
||
"۲٬۵۰۰٬۰۰۰ تومان",
|
||
);
|
||
expect(getFieldValue(report, "قیمت قطعات", "قطعه ۱ / مبلغ کل")).toBe(
|
||
"۳٬۰۰۰٬۰۰۰ تومان",
|
||
);
|
||
});
|
||
|
||
it("localizes legacy English car-body environmental conditions", () => {
|
||
const report = buildInsurerFileReport({
|
||
overview: { publicId: "A00012" },
|
||
blame: {
|
||
type: "CAR_BODY",
|
||
parties: [
|
||
{
|
||
role: "FIRST",
|
||
person: { userId: "damaged", fullName: "بیمهگذار" },
|
||
statement: {
|
||
weatherCondition: "CLEAR",
|
||
roadCondition: "wet",
|
||
lightCondition: "LOW_LIGHT",
|
||
},
|
||
},
|
||
],
|
||
},
|
||
});
|
||
|
||
expect(getFieldValue(report, PR.accidentSection, PR.weather)).toBe("صاف");
|
||
expect(getFieldValue(report, PR.accidentSection, PR.road)).toBe("مرطوب");
|
||
expect(getFieldValue(report, PR.accidentSection, PR.light)).toBe("کمنور");
|
||
});
|
||
|
||
it("exposes the damage expert part-price result as a separate section", () => {
|
||
const report = buildInsurerFileReport({
|
||
overview: { publicId: "A00013" },
|
||
claim: {
|
||
claimStatus: "APPROVED",
|
||
evaluation: {
|
||
damageExpertReply: {
|
||
description: "تعویض قطعه ضروری است",
|
||
parts: [
|
||
{
|
||
carPartDamage: { label_fa: "چراغ جلو" },
|
||
price: 4_000_000,
|
||
totalPayment: 4_000_000,
|
||
},
|
||
],
|
||
},
|
||
},
|
||
},
|
||
});
|
||
|
||
expect(getFieldValue(report, "قیمت قطعات", "قطعه ۱ / نام قطعه")).toBe(
|
||
"چراغ جلو",
|
||
);
|
||
expect(getFieldValue(report, "قیمت قطعات", "قطعه ۱ / قیمت قطعه")).toBe(
|
||
"۴٬۰۰۰٬۰۰۰ تومان",
|
||
);
|
||
});
|
||
|
||
it("falls back to claim history for the evaluation submission time", () => {
|
||
const report = buildInsurerFileReport({
|
||
overview: { publicId: "A00014" },
|
||
claim: {
|
||
evaluation: {
|
||
damageExpertReply: { description: "ارزیابی ثبت شد" },
|
||
},
|
||
history: [
|
||
{
|
||
type: "EXPERT_REPLY_SUBMITTED",
|
||
timestamp: "2026-08-10T12:30:45.000Z",
|
||
},
|
||
],
|
||
},
|
||
});
|
||
|
||
expect(
|
||
getFieldValue(report, PR.timelineSection, PR.evaluationRegisteredAt),
|
||
).toBe("1405/05/19 16:00");
|
||
expect(
|
||
getFieldValue(report, PR.evaluationSection, PR.evaluationSubmittedAt),
|
||
).toBe("1405/05/19 16:00");
|
||
});
|
||
|
||
it("uses the stored V4 licence type for a driver who differs from the policyholder", () => {
|
||
const report = buildInsurerFileReport({
|
||
overview: { publicId: "A00011" },
|
||
blame: {
|
||
type: "THIRD_PARTY",
|
||
parties: [
|
||
{
|
||
role: "FIRST",
|
||
person: { userId: "guilty", fullName: "مقصر" },
|
||
},
|
||
{
|
||
role: "SECOND",
|
||
person: {
|
||
userId: "damaged",
|
||
fullName: "بیمهگذار زیاندیده",
|
||
driverIsInsurer: false,
|
||
nationalCodeOfDriver: "0123456789",
|
||
driverLicense: "L-123",
|
||
licenseType: "پایه یک",
|
||
},
|
||
},
|
||
],
|
||
expert: { decision: { guiltyPartyId: "guilty" } },
|
||
},
|
||
});
|
||
|
||
expect(getFieldValue(report, PR.driverSection, PR.nationalCode)).toBe(
|
||
"0123456789",
|
||
);
|
||
expect(getFieldValue(report, PR.driverSection, PR.licenseType)).toBe(
|
||
"پایه یک",
|
||
);
|
||
});
|
||
});
|