1
0
forked from Yara724/api

Fixed mismatched userId on field expert for claim

This commit is contained in:
SepehrYahyaee
2026-06-20 11:53:18 +03:30
parent d355771518
commit 5a89a0ff16
26 changed files with 144 additions and 414 deletions

View File

@@ -2,6 +2,7 @@ import { Types } from "mongoose";
import { partyPersonMatchesUser } from "./iran-mobile";
import {
blameDamagedPartyMatchesUser,
resolveClaimOwnerFieldsFromBlame,
resolveDamagedPartyPerson,
resolveGuiltyPartyUserId,
} from "./blame-damaged-party";
@@ -46,13 +47,30 @@ describe("blame damaged party helpers", () => {
).toBe(false);
});
it("matches damaged party by phone when userId differs (duplicate accounts)", () => {
expect(
partyPersonMatchesUser(
{ userId: damagedId, phoneNumber: "9123456789" },
{ sub: "other-user-id", username: "09123456789" },
[],
),
).toBe(true);
it("resolveClaimOwnerFieldsFromBlame uses damaged userId and guilty clientId", () => {
const guiltyClientId = new Types.ObjectId();
const blame = {
type: "THIRD_PARTY",
expert: { decision: { guiltyPartyId: guiltyId } },
parties: [
{
role: "FIRST",
person: {
userId: guiltyId,
phoneNumber: "09111111111",
clientId: guiltyClientId,
},
},
{
role: "SECOND",
person: { userId: damagedId, phoneNumber: "09912356917" },
},
],
};
expect(resolveClaimOwnerFieldsFromBlame(blame)).toEqual({
userId: String(damagedId),
userRole: "SECOND",
clientId: String(guiltyClientId),
});
});
});

View File

@@ -119,3 +119,45 @@ export function resolveDamagedPartyUserId(
const person = resolveDamagedPartyPerson(blame);
return person?.userId != null ? String(person.userId) : null;
}
/** Guilty party row on the blame case (payer's insurer is on `person.clientId`). */
export function resolveGuiltyPartyPerson(
blame: Parameters<typeof resolveClaimOwnerParty>[0],
): { userId?: unknown; phoneNumber?: string; clientId?: unknown } | null {
const party = resolveClaimOwnerParty(blame);
return party?.person ?? null;
}
/**
* Claim `owner` fields for initiator-filled IN_PERSON claims (field expert / registrar).
* - `userId` = damaged party (SMS, user sign-off, claim beneficiary)
* - `clientId` = guilty party's insurer (damage-expert tenant queue)
*/
export function resolveClaimOwnerFieldsFromBlame(
blame: Parameters<typeof resolveDamagedPartyPerson>[0],
): {
userId: string;
userRole?: string;
clientId?: string;
} | null {
const damagedPerson = resolveDamagedPartyPerson(blame);
if (damagedPerson?.userId == null) return null;
const parties = blame?.parties ?? [];
const damagedUserId = String(damagedPerson.userId);
const damagedPartyRow = parties.find(
(p) =>
p.person?.userId != null &&
String(p.person.userId) === damagedUserId,
);
const guiltyPerson = resolveGuiltyPartyPerson(blame);
const payingClientId =
guiltyPerson?.clientId != null ? String(guiltyPerson.clientId) : undefined;
return {
userId: damagedUserId,
userRole: damagedPartyRow?.role,
...(payingClientId ? { clientId: payingClientId } : {}),
};
}