forked from Yara724/api
257 lines
7.4 KiB
TypeScript
257 lines
7.4 KiB
TypeScript
import { BlameRequestType } from "src/Types&Enums/blame-request-management/blameRequestType.enum";
|
|
import { PartyRole } from "src/request-management/entities/schema/partyRole.enum";
|
|
import {
|
|
FANAVARAN_CAR_BODY_LINE_ID,
|
|
FANAVARAN_THIRD_PARTY_LINE_ID,
|
|
asObjectRecord,
|
|
parseFanavaranId,
|
|
type FanavaranCarPolicyProduct,
|
|
} from "src/lookups/fanavaran-last-car-policy";
|
|
|
|
export type FanavaranClaimProduct = FanavaranCarPolicyProduct;
|
|
|
|
const FANAVARAN_CLAIMS_HOST =
|
|
"https://apimanager.iraneit.com/BimeApiManager/api/BimeApi/v2.0/car";
|
|
|
|
export function fanavaranClaimProductFromBlameType(
|
|
type?: string | null,
|
|
): FanavaranClaimProduct {
|
|
return type === BlameRequestType.CAR_BODY || type === "CAR_BODY"
|
|
? "car-body"
|
|
: "third-party";
|
|
}
|
|
|
|
export function isFanavaranSubmitSupportedBlameType(
|
|
type?: string | null,
|
|
): boolean {
|
|
return (
|
|
type === BlameRequestType.THIRD_PARTY ||
|
|
type === "THIRD_PARTY" ||
|
|
type === BlameRequestType.CAR_BODY ||
|
|
type === "CAR_BODY"
|
|
);
|
|
}
|
|
|
|
export function fanavaranClaimsResourcePath(
|
|
product: FanavaranClaimProduct,
|
|
): string {
|
|
return product === "car-body"
|
|
? "vehicle-hull-claims"
|
|
: "third-party-car-financial-claims";
|
|
}
|
|
|
|
export function fanavaranClaimsBaseUrl(
|
|
product: FanavaranClaimProduct,
|
|
): string {
|
|
return `${FANAVARAN_CLAIMS_HOST}/${fanavaranClaimsResourcePath(product)}`;
|
|
}
|
|
|
|
export type FanavaranClaimStage = "damage-case" | "attachments" | "expertise";
|
|
|
|
/** Hull (بدنه) has no GEN.12 dmg-cases resource. Proven 2026-09-15: Feature:url(.../vehicle-hull-claims/{id}/dmg-cases) not found. Files and expertise do exist. */
|
|
export const FANAVARAN_HULL_NO_DAMAGE_CASE_REASON =
|
|
"Fanavaran vehicle-hull-claims has no dmg-cases resource. Hull is first-party (one damaged vehicle on the base claim). Continue with files and expertise.";
|
|
|
|
export function fanavaranHasDamageCaseStage(
|
|
product: FanavaranClaimProduct,
|
|
): boolean {
|
|
return product === "third-party";
|
|
}
|
|
|
|
export function fanavaranClaimStageUrl(
|
|
product: FanavaranClaimProduct,
|
|
stage: FanavaranClaimStage,
|
|
claimId: number | string,
|
|
): string | null {
|
|
if (stage === "damage-case" && !fanavaranHasDamageCaseStage(product)) {
|
|
return null;
|
|
}
|
|
const suffix =
|
|
stage === "damage-case"
|
|
? "dmg-cases"
|
|
: stage === "attachments"
|
|
? "files"
|
|
: "expertise";
|
|
return `${fanavaranClaimsBaseUrl(product)}/${claimId}/${suffix}`;
|
|
}
|
|
|
|
export function fanavaranInsuranceLineIdForProduct(
|
|
product: FanavaranClaimProduct,
|
|
): number {
|
|
return product === "car-body"
|
|
? FANAVARAN_CAR_BODY_LINE_ID
|
|
: FANAVARAN_THIRD_PARTY_LINE_ID;
|
|
}
|
|
|
|
type BlamePartyForCarBodyPolicy = {
|
|
role?: string;
|
|
person?: { nationalCodeOfInsurer?: unknown };
|
|
insurance?: {
|
|
carBodyInsurance?: {
|
|
policyId?: unknown;
|
|
ownerNationalCode?: unknown;
|
|
insurerNationalCode?: unknown;
|
|
policyNumber?: unknown;
|
|
chassisNumber?: unknown;
|
|
motorNumber?: unknown;
|
|
vin?: unknown;
|
|
startDate?: unknown;
|
|
endDate?: unknown;
|
|
};
|
|
};
|
|
vehicle?: {
|
|
inquiry?: {
|
|
mapped?: Record<string, unknown>;
|
|
raw?: Record<string, unknown> | { data?: Record<string, unknown> };
|
|
carBody?: {
|
|
mapped?: Record<string, unknown>;
|
|
raw?: Record<string, unknown> & {
|
|
policyId?: unknown;
|
|
policy?: Record<string, unknown>;
|
|
vehicle?: Record<string, unknown>;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
function firstCarBodyParty(
|
|
blame?: { parties?: BlamePartyForCarBodyPolicy[] } | null,
|
|
): BlamePartyForCarBodyPolicy | null {
|
|
const parties = blame?.parties ?? [];
|
|
return (
|
|
parties.find((party) => party?.role === PartyRole.FIRST) ??
|
|
parties[0] ??
|
|
null
|
|
);
|
|
}
|
|
|
|
function nonEmptyText(value: unknown): string | null {
|
|
if (value == null) return null;
|
|
const text = String(value).trim();
|
|
return text ? text : null;
|
|
}
|
|
|
|
export function pickStoredCarBodyPolicyId(
|
|
blame?: { parties?: BlamePartyForCarBodyPolicy[] } | null,
|
|
): number | null {
|
|
const party = firstCarBodyParty(blame);
|
|
const carBody = party?.vehicle?.inquiry?.carBody;
|
|
const raw = asObjectRecord(carBody?.raw) ?? {};
|
|
const mapped = asObjectRecord(carBody?.mapped) ?? {};
|
|
const rawPolicy = asObjectRecord(raw.policy);
|
|
return parseFanavaranId(
|
|
party?.insurance?.carBodyInsurance?.policyId ??
|
|
mapped.policyId ??
|
|
raw.policyId ??
|
|
rawPolicy?.PolicyId,
|
|
);
|
|
}
|
|
|
|
export function pickCarBodyPolicyNationalCode(
|
|
blame?: { parties?: BlamePartyForCarBodyPolicy[] } | null,
|
|
): string | null {
|
|
const party = firstCarBodyParty(blame);
|
|
return (
|
|
nonEmptyText(party?.person?.nationalCodeOfInsurer) ??
|
|
nonEmptyText(party?.insurance?.carBodyInsurance?.ownerNationalCode) ??
|
|
nonEmptyText(party?.insurance?.carBodyInsurance?.insurerNationalCode)
|
|
);
|
|
}
|
|
|
|
export function fanavaranPartyInquirySources(
|
|
product: FanavaranClaimProduct,
|
|
party?: BlamePartyForCarBodyPolicy | null,
|
|
): {
|
|
mapped: Record<string, any>;
|
|
raw: Record<string, any>;
|
|
} {
|
|
const inquiry = party?.vehicle?.inquiry ?? {};
|
|
if (product !== "car-body") {
|
|
const mapped = asObjectRecord(inquiry.mapped) ?? {};
|
|
const rawValue = inquiry.raw as
|
|
| Record<string, unknown>
|
|
| { data?: Record<string, unknown> }
|
|
| undefined;
|
|
const raw =
|
|
asObjectRecord(
|
|
rawValue &&
|
|
typeof rawValue === "object" &&
|
|
"data" in rawValue &&
|
|
rawValue.data != null &&
|
|
typeof rawValue.data === "object" &&
|
|
!Array.isArray(rawValue.data)
|
|
? rawValue.data
|
|
: rawValue,
|
|
) ?? {};
|
|
return { mapped, raw };
|
|
}
|
|
|
|
const carBody = inquiry.carBody ?? {};
|
|
const mapped = asObjectRecord(carBody.mapped) ?? {};
|
|
const raw = asObjectRecord(carBody.raw) ?? {};
|
|
const policy = asObjectRecord(raw.policy) ?? {};
|
|
const vehicle = asObjectRecord(raw.vehicle) ?? {};
|
|
const insurance = party?.insurance?.carBodyInsurance ?? {};
|
|
|
|
const policyNumber =
|
|
mapped.policyNumber ??
|
|
insurance.policyNumber ??
|
|
policy.CINumber ??
|
|
policy.PolicyNo;
|
|
const chassisNumber =
|
|
mapped.chassisNumber ?? insurance.chassisNumber ?? vehicle.ChassisNo;
|
|
const motorNumber =
|
|
mapped.motorNumber ?? insurance.motorNumber ?? vehicle.MotorNo;
|
|
const vin = mapped.vin ?? insurance.vin ?? vehicle.VIN ?? vehicle.ChassisNo;
|
|
const beginDate =
|
|
mapped.StartDate ?? mapped.startDate ?? insurance.startDate ?? policy.BeginDate;
|
|
const endDate =
|
|
mapped.EndDate ?? mapped.endDate ?? insurance.endDate ?? policy.EndDate;
|
|
const builtYear = mapped.builtYear ?? vehicle.BuiltYear;
|
|
const plaque = asObjectRecord(vehicle.plaque) ?? {};
|
|
const plk1 =
|
|
mapped.platePartOne ?? plaque.leftTwoDigits ?? vehicle.PlaqueLeftNo;
|
|
const plk2 =
|
|
mapped.plateLetterTitle ?? plaque.serialLetter;
|
|
const plk3 =
|
|
mapped.platePartThree ?? plaque.threeDigits ?? vehicle.PlaqueRightNo;
|
|
const plksrl =
|
|
mapped.plateSerialNumber ??
|
|
plaque.rightTwoDigits ??
|
|
vehicle.PlaqueSerial;
|
|
|
|
return {
|
|
mapped: {
|
|
...mapped,
|
|
...insurance,
|
|
policyId:
|
|
mapped.policyId ??
|
|
insurance.policyId ??
|
|
raw.policyId ??
|
|
policy.PolicyId,
|
|
PrntCmpDocNo: policyNumber,
|
|
PlcyUnqCod: policy.PolicyUnqCod ?? mapped.policyNumber,
|
|
ShsNum: chassisNumber,
|
|
MtrNum: motorNumber,
|
|
VIN: vin,
|
|
HBgnDte: beginDate,
|
|
HEndDte: endDate,
|
|
PrdDte: builtYear,
|
|
plk1,
|
|
Plk1: plk1,
|
|
plk2,
|
|
Plk2: plk2,
|
|
plk3,
|
|
Plk3: plk3,
|
|
plksrl,
|
|
PlkSrl: plksrl,
|
|
},
|
|
raw: {
|
|
...policy,
|
|
...vehicle,
|
|
...raw,
|
|
},
|
|
};
|
|
}
|