fanavaran driver and owner id (GEN..44 defauts) - culprit type id dynamic

This commit is contained in:
2026-09-28 16:13:32 +03:30
parent a74e20b25f
commit 165afe56ae
7 changed files with 303 additions and 36 deletions

View File

@@ -10,6 +10,9 @@ export type FanavaranPartyInquiryRow = {
NationalCode?: unknown;
Name?: unknown;
LastName?: unknown;
FatherName?: unknown;
GenderId?: unknown;
IdentityNo?: unknown;
};
function asPositiveId(value: unknown): number | null {
@@ -34,9 +37,25 @@ export function asPartyInquiryRows(value: unknown): FanavaranPartyInquiryRow[] {
return [];
}
/** GEN.12 DriverId is only accepted for بیمه‌گذار (161) or سایر (166). */
export const FANAVARAN_DRIVER_ACCEPTED_ROLE_IDS = [
FANAVARAN_INSURER_ROLE_ID,
FANAVARAN_DRIVER_ROLE_ID,
] as const;
export function isAcceptableFanavaranDriverRole(
roleId: unknown,
): boolean {
const id = asPositiveId(roleId);
return (
id === FANAVARAN_INSURER_ROLE_ID || id === FANAVARAN_DRIVER_ROLE_ID
);
}
function selectFanavaranIdByRoles(
rows: unknown,
preferredRoles: number[],
options?: { allowFallbackToFirst?: boolean },
): number | null {
const parties = asPartyInquiryRows(rows);
if (parties.length === 0) return null;
@@ -46,38 +65,38 @@ function selectFanavaranIdByRoles(
if (match) return asPositiveId(match.Id);
}
if (options?.allowFallbackToFirst === false) return null;
return asPositiveId(parties[0].Id);
}
/**
* DriverId for GEN.12 زیان‌دیده. Prefer insurer (161) or driver (166)
* based on driverIsInsurer, then any returned party id.
* DriverId for GEN.12 زیان‌دیده.
* Only RoleId 161 (بیمه‌گذار) or 166 (سایر) are accepted by Fanavaran.
* Other roles (e.g. 162 بیمه‌شده) must go through GEN.44 other-people first
* (GEN.44 adds a RoleId-166 entry; it does not replace existing role rows).
*/
export function selectFanavaranDriverId(
rows: unknown,
driverIsInsurer: boolean | undefined,
): number | null {
const preferredRoles = driverIsInsurer
? [
FANAVARAN_INSURER_ROLE_ID,
FANAVARAN_DRIVER_ROLE_ID,
FANAVARAN_PLAQUE_OWNER_ROLE_ID,
]
: [
FANAVARAN_DRIVER_ROLE_ID,
FANAVARAN_INSURER_ROLE_ID,
FANAVARAN_PLAQUE_OWNER_ROLE_ID,
];
return selectFanavaranIdByRoles(rows, preferredRoles);
? [FANAVARAN_INSURER_ROLE_ID, FANAVARAN_DRIVER_ROLE_ID]
: [FANAVARAN_DRIVER_ROLE_ID, FANAVARAN_INSURER_ROLE_ID];
return selectFanavaranIdByRoles(rows, preferredRoles, {
allowFallbackToFirst: false,
});
}
/** OwnerId: prefer plaque-owner role (163), then insurer / driver. */
/**
* OwnerId for GEN.12: same accepted roles as DriverId (161 / 166 only).
* Prefer بیمه‌گذار then سایر. RoleId 162/163/… → null → GEN.44 on submit.
*/
export function selectFanavaranOwnerId(rows: unknown): number | null {
return selectFanavaranIdByRoles(rows, [
FANAVARAN_PLAQUE_OWNER_ROLE_ID,
FANAVARAN_INSURER_ROLE_ID,
FANAVARAN_DRIVER_ROLE_ID,
]);
return selectFanavaranIdByRoles(
rows,
[FANAVARAN_INSURER_ROLE_ID, FANAVARAN_DRIVER_ROLE_ID],
{ allowFallbackToFirst: false },
);
}
export function normalizeNationalCode(value: unknown): string | null {