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; raw?: Record | { data?: Record }; carBody?: { mapped?: Record; raw?: Record & { policyId?: unknown; policy?: Record; vehicle?: Record; }; }; }; }; }; 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; raw: Record; } { const inquiry = party?.vehicle?.inquiry ?? {}; if (product !== "car-body") { const mapped = asObjectRecord(inquiry.mapped) ?? {}; const rawValue = inquiry.raw as | Record | { data?: Record } | 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, }, }; }