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 544e514..420af14 100644 --- a/src/case-expert-report/case-expert-report.builder.spec.ts +++ b/src/case-expert-report/case-expert-report.builder.spec.ts @@ -230,4 +230,38 @@ describe("buildInsurerFileReport", () => { "نیاز به تعویض سپر جلو", ); }); + + 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( + "پایه یک", + ); + }); }); diff --git a/src/case-expert-report/case-expert-report.builder.ts b/src/case-expert-report/case-expert-report.builder.ts index a65485c..fdb1445 100644 --- a/src/case-expert-report/case-expert-report.builder.ts +++ b/src/case-expert-report/case-expert-report.builder.ts @@ -565,7 +565,10 @@ function buildDriverSection( { label: PR.name, value: asString(person.fullName) }, { label: PR.licenseType, - value: licenseType ?? (person.driverLicense ? PR.driverLicense : undefined), + value: + licenseType ?? + asString(person.licenseType) ?? + (person.driverLicense ? PR.driverLicense : undefined), }, { label: PR.licenseDate, diff --git a/src/claim-request-management/fanavaran-claim-references.spec.ts b/src/claim-request-management/fanavaran-claim-references.spec.ts index 0ee70f5..def288a 100644 --- a/src/claim-request-management/fanavaran-claim-references.spec.ts +++ b/src/claim-request-management/fanavaran-claim-references.spec.ts @@ -19,6 +19,41 @@ describe("fanavaranClaimReferences", () => { }); }); + it("exposes the persisted Fanavaran reference codes to expert detail APIs", () => { + expect( + fanavaranClaimReferences({ + status: ClaimCaseStatus.COMPLETED, + claimId: 100, + claimNo: 101, + dmgCaseId: 102, + expertiseId: 103, + fanavaranSync: { + baseClaim: { policyId: 104 }, + damageCase: { + driverId: 105, + vehicleKindId: 106, + plaqueKindId: 107, + plaqueSampleId: 108, + accidentVehicleUsedId: 109, + insuranceCorpId: 110, + }, + }, + }), + ).toEqual({ + claimId: 100, + claimNo: 101, + dmgCaseId: 102, + expertiseId: 103, + policyId: 104, + driverId: 105, + vehicleKindId: 106, + plaqueKindId: 107, + plaqueSampleId: 108, + accidentVehicleUsedId: 109, + insuranceCorpId: 110, + }); + }); + it("omits missing ids", () => { expect( fanavaranClaimReferences({ diff --git a/src/claim-request-management/fanavaran-claim-references.ts b/src/claim-request-management/fanavaran-claim-references.ts index f59b809..d1bce8f 100644 --- a/src/claim-request-management/fanavaran-claim-references.ts +++ b/src/claim-request-management/fanavaran-claim-references.ts @@ -5,6 +5,13 @@ export type FanavaranClaimReferences = { claimNo?: number; dmgCaseId?: number; expertiseId?: number; + policyId?: number; + driverId?: number; + vehicleKindId?: number; + plaqueKindId?: number; + plaqueSampleId?: number; + accidentVehicleUsedId?: number; + insuranceCorpId?: number; }; /** @@ -16,6 +23,10 @@ export function fanavaranClaimReferences(claim: { claimNo?: number | null; dmgCaseId?: number | null; expertiseId?: number | null; + fanavaranSync?: { + baseClaim?: FanavaranReferenceStage | null; + damageCase?: FanavaranReferenceStage | null; + } | null; }): FanavaranClaimReferences | undefined { if (claim.status !== ClaimCaseStatus.COMPLETED) { return undefined; @@ -27,5 +38,43 @@ export function fanavaranClaimReferences(claim: { if (claim.dmgCaseId != null) refs.dmgCaseId = claim.dmgCaseId; if (claim.expertiseId != null) refs.expertiseId = claim.expertiseId; + const baseClaim = claim.fanavaranSync?.baseClaim; + const damageCase = claim.fanavaranSync?.damageCase; + if (baseClaim?.policyId != null) refs.policyId = baseClaim.policyId; + if ((damageCase?.driverId ?? baseClaim?.driverId) != null) { + refs.driverId = damageCase?.driverId ?? baseClaim?.driverId; + } + if ((damageCase?.vehicleKindId ?? baseClaim?.vehicleKindId) != null) { + refs.vehicleKindId = + damageCase?.vehicleKindId ?? baseClaim?.vehicleKindId; + } + if (damageCase?.plaqueKindId != null) { + refs.plaqueKindId = damageCase.plaqueKindId; + } + if (damageCase?.plaqueSampleId != null) { + refs.plaqueSampleId = damageCase.plaqueSampleId; + } + if ( + (damageCase?.accidentVehicleUsedId ?? baseClaim?.accidentVehicleUsedId) != + null + ) { + refs.accidentVehicleUsedId = + damageCase?.accidentVehicleUsedId ?? baseClaim?.accidentVehicleUsedId; + } + if ((damageCase?.insuranceCorpId ?? baseClaim?.insuranceCorpId) != null) { + refs.insuranceCorpId = + damageCase?.insuranceCorpId ?? baseClaim?.insuranceCorpId; + } + return Object.keys(refs).length > 0 ? refs : undefined; } + +type FanavaranReferenceStage = { + policyId?: number | null; + driverId?: number | null; + vehicleKindId?: number | null; + plaqueKindId?: number | null; + plaqueSampleId?: number | null; + accidentVehicleUsedId?: number | null; + insuranceCorpId?: number | null; +}; diff --git a/src/expert-claim/dto/claim-detail-v2.dto.ts b/src/expert-claim/dto/claim-detail-v2.dto.ts index 5ae32fe..2a2cc2f 100644 --- a/src/expert-claim/dto/claim-detail-v2.dto.ts +++ b/src/expert-claim/dto/claim-detail-v2.dto.ts @@ -178,6 +178,13 @@ export class ClaimDetailV2ResponseDto { claimNo?: number; dmgCaseId?: number; expertiseId?: number; + policyId?: number; + driverId?: number; + vehicleKindId?: number; + plaqueKindId?: number; + plaqueSampleId?: number; + accidentVehicleUsedId?: number; + insuranceCorpId?: number; }; @ApiPropertyOptional({ diff --git a/src/request-management/request-management.file-reviewer.spec.ts b/src/request-management/request-management.file-reviewer.spec.ts index d026a3b..df1fdf5 100644 --- a/src/request-management/request-management.file-reviewer.spec.ts +++ b/src/request-management/request-management.file-reviewer.spec.ts @@ -104,6 +104,69 @@ describe("RequestManagementService FileReviewer inbox", () => { ).rejects.toThrow("does not belong to your organization"); }); + it("returns party identity, VIN plate and claim payment/reference data to the V4 reviewer", async () => { + const { service } = createService([]); + const request = { + ...sealedFile, + parties: [ + { + role: "FIRST", + person: { + clientId, + fullName: "راننده و بیمه‌گذار نمونه", + nationalCodeOfInsurer: "1111111111", + nationalCodeOfDriver: "2222222222", + driverIsInsurer: false, + licenseType: "پایه یک", + driverLicense: "L-123", + }, + vehicle: { plateId: "11-22-ب-333", vin: "VIN-123" }, + }, + ], + }; + (service as any).blameRequestDbService.findById = jest + .fn() + .mockResolvedValue(request); + (service as any).claimCaseDbService = { + findOne: jest.fn().mockResolvedValue({ + _id: new Types.ObjectId(), + status: "COMPLETED", + workflow: {}, + money: { sheba: "IR123" }, + claimId: 101, + fanavaranSync: { baseClaim: { policyId: 202 } }, + }), + }; + + const result = await service.getMyFileReviewerFileDetail( + { + sub: String(reviewerId), + role: RoleEnum.FILE_REVIEWER, + clientKey: String(clientId), + }, + String(sealedFile._id), + ); + + expect(result.parties[0]).toEqual( + expect.objectContaining({ + person: expect.objectContaining({ + fullName: "راننده و بیمه‌گذار نمونه", + nationalCodeOfInsurer: "1111111111", + nationalCodeOfDriver: "2222222222", + licenseType: "پایه یک", + }), + vehicle: expect.objectContaining({ + plateId: "11-22-ب-333", + vin: "VIN-123", + }), + }), + ); + expect(result.money).toEqual({ sheba: "IR123" }); + expect(result.fanavaran).toEqual( + expect.objectContaining({ claimId: 101, policyId: 202 }), + ); + }); + it("does not let a reviewer claim another tenant's file through its linked claim ID", async () => { const blameRequestDbService = { findById: jest.fn().mockResolvedValue({ diff --git a/src/request-management/request-management.service.ts b/src/request-management/request-management.service.ts index 072f750..adffb84 100644 --- a/src/request-management/request-management.service.ts +++ b/src/request-management/request-management.service.ts @@ -116,6 +116,7 @@ import { } from "src/helpers/tenant-scope"; import { resolveLinkedUserIdStrings } from "src/helpers/user-access-resolver"; import { normalizePlateText } from "src/utils/plate-normalizer/plate-normalizer.service"; +import { fanavaranClaimReferences } from "src/claim-request-management/fanavaran-claim-references"; /** * Formats a compact Jalali date (number or string like 13780624) as YYYY/MM/DD. @@ -11530,10 +11531,15 @@ export class RequestManagementService { parties: (plain.parties ?? []).map((p: any) => ({ role: p.role, person: { + fullName: p.person?.fullName, phoneNumber: p.person?.phoneNumber, nationalCodeOfInsurer: p.person?.nationalCodeOfInsurer, nationalCodeOfDriver: p.person?.nationalCodeOfDriver, driverIsInsurer: p.person?.driverIsInsurer, + insurerBirthday: p.person?.insurerBirthday, + driverBirthday: p.person?.driverBirthday, + insurerLicense: p.person?.insurerLicense, + driverLicense: p.person?.driverLicense, userId: p.person?.userId ? String(p.person.userId) : undefined, clientId: p.person?.clientId ? String(p.person.clientId) : undefined, licenseType: p.person?.licenseType ?? undefined, @@ -11547,6 +11553,7 @@ export class RequestManagementService { } : undefined, vehicle: p.vehicle ? { plateId: p.vehicle.plateId, + vin: p.vehicle.vin, name: p.vehicle.name, type: p.vehicle.type, } : undefined, @@ -11557,6 +11564,8 @@ export class RequestManagementService { ...(claimPlain ? { claimStatus: claimPlain.status, claimWorkflow: claimPlain.workflow, + money: claimPlain.money ?? null, + fanavaran: fanavaranClaimReferences(claimPlain), fileMakerRejectionCount: claimPlain.fileMakerRejectionCount ?? 0, fileMakerRejectionReason: claimPlain.fileMakerRejectionReason ?? null, evaluation: claimPlain.evaluation @@ -11682,10 +11691,15 @@ export class RequestManagementService { parties: (plain.parties ?? []).map((p: any) => ({ role: p.role, person: { + fullName: p.person?.fullName, phoneNumber: p.person?.phoneNumber, nationalCodeOfInsurer: p.person?.nationalCodeOfInsurer, nationalCodeOfDriver: p.person?.nationalCodeOfDriver, driverIsInsurer: p.person?.driverIsInsurer, + insurerBirthday: p.person?.insurerBirthday, + driverBirthday: p.person?.driverBirthday, + insurerLicense: p.person?.insurerLicense, + driverLicense: p.person?.driverLicense, userId: p.person?.userId ? String(p.person.userId) : undefined, clientId: p.person?.clientId ? String(p.person.clientId) : undefined, licenseType: p.person?.licenseType ?? undefined, @@ -11699,6 +11713,7 @@ export class RequestManagementService { } : undefined, vehicle: p.vehicle ? { plateId: p.vehicle.plateId, + vin: p.vehicle.vin, name: p.vehicle.name, type: p.vehicle.type, } : undefined, @@ -11719,6 +11734,8 @@ export class RequestManagementService { ...(claimPlain ? { claimStatus: claimPlain.status, claimWorkflow: claimPlain.workflow, + money: claimPlain.money ?? null, + fanavaran: fanavaranClaimReferences(claimPlain), fileMakerRejectionCount: claimPlain.fileMakerRejectionCount ?? 0, fileMakerRejectionReason: claimPlain.fileMakerRejectionReason ?? null, evaluation: claimPlain.evaluation