From 226b63aefb23f357cfb7e326be9a9aa11302b1af Mon Sep 17 00:00:00 2001 From: SepehrYahyaee <7heycallmegray@gmail.com> Date: Wed, 26 Aug 2026 15:57:09 +0330 Subject: [PATCH] Added new data for YARA-1241 --- .../case-expert-report.builder.spec.ts | 43 +++++++- .../case-expert-report.builder.ts | 103 ++++++++++++++++-- .../persian-report-labels.ts | 8 ++ 3 files changed, 144 insertions(+), 10 deletions(-) diff --git a/src/case-expert-report/case-expert-report.builder.spec.ts b/src/case-expert-report/case-expert-report.builder.spec.ts index 28d94b9..94bbb50 100644 --- a/src/case-expert-report/case-expert-report.builder.spec.ts +++ b/src/case-expert-report/case-expert-report.builder.spec.ts @@ -41,7 +41,21 @@ describe("buildInsurerFileReport", () => { phoneNumber: "09120000000", clientId: "client-guilty", }, - statement: { admitsGuilt: true }, + 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: "بیمه ثالث مقصر", @@ -68,6 +82,7 @@ describe("buildInsurerFileReport", () => { }, statement: { claimsDamage: true, + acceptsExpertOpinion: false, description: "توضیحات زیان‌دیده", accidentDate: "2026-08-10", accidentTime: "13:23", @@ -153,6 +168,32 @@ describe("buildInsurerFileReport", () => { "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", ); diff --git a/src/case-expert-report/case-expert-report.builder.ts b/src/case-expert-report/case-expert-report.builder.ts index 0abf1af..5dfcd04 100644 --- a/src/case-expert-report/case-expert-report.builder.ts +++ b/src/case-expert-report/case-expert-report.builder.ts @@ -258,6 +258,28 @@ function getPartyRole(party: ReportParty | null | undefined): string | undefined return typeof role === "string" ? role : undefined; } +function partyKindLabel( + party: ReportParty | null | undefined, + damagedParty: ReportParty | null, + guiltyParty: ReportParty | null, +): string | undefined { + if (sameParty(party, damagedParty)) return "damaged"; + if (sameParty(party, guiltyParty)) return "guilty"; + return undefined; +} + +function partyRoleLabel(role: string | undefined): string | undefined { + if (!role) return undefined; + if (role === PartyRole.FIRST) return "طرف اول"; + if (role === PartyRole.SECOND) return "طرف دوم"; + return role; +} + +function statementBoolean(value: unknown): string | undefined { + if (typeof value !== "boolean") return undefined; + return persianStatus(value); +} + function sameParty( first: ReportParty | null | undefined, second: ReportParty | null | undefined, @@ -536,16 +558,60 @@ function buildDriverSection( ]); } -function buildVehicleSection( - damagedParty: ReportParty | null, - claim?: Record | null, -): InsurerFileReportSection { - const partyVehicle = damagedParty?.vehicle; - const claimVehicle = claim?.vehicle as Record | undefined; +function buildPartyVehicleSection( + title: string, + party: ReportParty | null | undefined, + claimVehicle?: Record, +): InsurerFileReportSection | undefined { + if (!party && !claimVehicle) return undefined; - return buildSection(PR.vehicleSection, [ + return buildSection(title, [ ...flattenObject(claimVehicle, "claim.vehicle"), - ...flattenObject(partyVehicle, "party.vehicle"), + ...flattenObject(party?.vehicle, "party.vehicle"), + ]); +} + +function buildPartyStatementSection( + title: string, + party: ReportParty | null | undefined, + damagedParty: ReportParty | null, + guiltyParty: ReportParty | null, +): InsurerFileReportSection | undefined { + if (!party) return undefined; + const statement = (party.statement ?? {}) as ReportRecord; + const kind = partyKindLabel(party, damagedParty, guiltyParty); + + return buildSection(title, [ + { + label: PR.partyRole, + value: partyRoleLabel(getPartyRole(party)), + }, + { + label: PR.name, + value: firstDefined(party.person?.fullName), + }, + { + label: PR.admitsGuilt, + value: + kind === "damaged" + ? undefined + : statementBoolean(statement.admitsGuilt), + }, + { + label: PR.claimsDamage, + value: + kind === "guilty" + ? undefined + : statementBoolean(statement.claimsDamage), + }, + { + label: PR.acceptsExpertOpinion, + value: statementBoolean(statement.acceptsExpertOpinion), + }, + { + label: PR.partyDescription, + value: asString(statement.description), + }, ]); } @@ -768,6 +834,8 @@ export function buildInsurerFileReport(file: { String((blameContext?.type as string | undefined) ?? "") === "CAR_BODY"; const includeGuiltySections = !!guiltyParty && !(isCarBody && sameParty(damagedParty, guiltyParty)); + const claimVehicle = claim?.vehicle as Record | undefined; + const sections = filterEmptySections([ buildCaseTimelineSection(overview, claim), buildOwnerSection(damagedParty, claim), @@ -792,7 +860,24 @@ export function buildInsurerFileReport(file: { buildCarBodyInsuranceFields(guiltyParty, blameContext, claim), ) : undefined, - buildVehicleSection(damagedParty, claim), + buildPartyVehicleSection(PR.damagedVehicleSection, damagedParty, claimVehicle), + includeGuiltySections + ? buildPartyVehicleSection(PR.guiltyVehicleSection, guiltyParty) + : undefined, + buildPartyStatementSection( + PR.damagedStatementSection, + damagedParty, + damagedParty, + guiltyParty, + ), + includeGuiltySections + ? buildPartyStatementSection( + PR.guiltyStatementSection, + guiltyParty, + damagedParty, + guiltyParty, + ) + : undefined, buildFanavaranCodesSection(claim), buildEvaluationSection(claim), buildAccidentReportSection(blameContext, claim, damagedParty), diff --git a/src/case-expert-report/persian-report-labels.ts b/src/case-expert-report/persian-report-labels.ts index 86b081e..57319ba 100644 --- a/src/case-expert-report/persian-report-labels.ts +++ b/src/case-expert-report/persian-report-labels.ts @@ -9,7 +9,11 @@ export const PR = { damagedCarBodyInsuranceSection: "بیمه بدنه زیان‌دیده", guiltyThirdPartyInsuranceSection: "بیمه شخص ثالث مقصر", guiltyCarBodyInsuranceSection: "بیمه بدنه مقصر", + damagedVehicleSection: "اطلاعات خودروی زیان‌دیده", + guiltyVehicleSection: "اطلاعات خودروی مقصر", vehicleSection: "اطلاعات خودرو", + damagedStatementSection: "اظهارات و اقرار زیان‌دیده", + guiltyStatementSection: "اظهارات و اقرار مقصر", timelineSection: "زمان‌بندی پرونده", fanavaranSection: "کدهای فناوران", evaluationSection: "نتیجه ارزیابی", @@ -43,6 +47,10 @@ export const PR = { evaluationExpert: "کارشناس ارزیاب", evaluationSubmittedAt: "تاریخ و ساعت ثبت ارزیابی", evaluationResponse: "پاسخ / توضیحات کارشناس", + admitsGuilt: "اقرار به تقصیر", + claimsDamage: "ادعای خسارت", + acceptsExpertOpinion: "پذیرش نظر کارشناس", + partyRole: "نقش طرف", data: "اطلاعات", date: "تاریخ", time: "زمان",