/** GEN.03 VHUD input fields. Do not send ثالث-only keys (DamagedCount, HasOtherCulprit, plaques, …). */ export const FANAVARAN_HULL_BASE_CLAIM_KEYS = [ "ArchiveNo", "AccidentDate", "AccidentTime", "AnnouncementDate", "AccidentLocationAddress", "ClaimExpertId", "EntryDate", "CulpritLicenceNo", "CulpritLicenceIssuDate", "CulpritLicenceForeignCityName", "PoliceReportSeri", "PoliceReportSerial", "PoliceReportDesc", "CustomerFaultPercent", "CulpritLevelTwoLicenceIssuDate", "ActualPremium", "EstimateAmount", "TrackingCode", "CourtArchiveNo", "PlaqueReplacementDate", "StatusChangeDate", "ClaimCompletionDate", "DmgAssessorFirstCreationTime", "PolicyId", "IsSurplusArticleEighthLaw", "AccidentCityId", "AccidentCauseId", "AccidentTypeId", "GlassBreakReasonId", "CulpritTypeId", "AuthorityCulpritId", "AccidentCulpritId", "CulpritLicenceTypeId", "IsLicenseReplaced", "CulpritLicenceCountryId", "CulpritLicenceCityId", "AccidentReportTypeId", "PoliceOfficerId", "IsAccidentOutOfBorder", "AccidentVehicleUsedId", "IsOwnerChanged", "CostSeparationToDmgSections", ] as const; /** GEN.03 default: تصادف(حادثه). Lookup: GET /lookups/vehicle-hull-accident-types */ export const FANAVARAN_DEFAULT_HULL_ACCIDENT_TYPE_ID = 2; /** GEN.03 ans (0=خیر). Used for CostSeparationToDmgSections, IsOwnerChanged, IsLicenseReplaced. */ export const FANAVARAN_HULL_ANS_NO = 0; /** GEN.03 hull culprit type when third-party is at fault. Lookup: vehicle-hull-accident-culprit-type */ export const FANAVARAN_DEFAULT_HULL_CULPRIT_TYPE_ID = 300; /** GEN.03 required: درصد تقصير بيمه گذار. Proven Parsian submit uses 100. */ export const FANAVARAN_DEFAULT_HULL_CUSTOMER_FAULT_PERCENT = 100; /** * GEN.03 required: مرجع تعيين مقصر. * Lookup: GET /lookups/detection-accident-culprits. Fallback is بیمه‌گذار. */ export const FANAVARAN_DEFAULT_HULL_AUTHORITY_CULPRIT_ID = 1; export const FANAVARAN_HULL_AUTHORITY_CULPRIT_CAPTION = "بيمه گذار"; /** GEN.03 ActualPremium from GET car/vehicle-hull-policies/{PolicyId} → TotalPremium. */ export function actualPremiumFromHullPolicyRecord( policy: Record | null | undefined, ): number | null { if (!policy) return null; const raw = policy.TotalPremium ?? policy.totalPremium; const n = typeof raw === "number" ? raw : Number(raw); return Number.isFinite(n) && n >= 0 ? n : null; } function normalizeHullCaption(value: unknown): string { return String(value ?? "") .replace(/ي/g, "ی") .replace(/ك/g, "ک") .replace(/\s+/g, " ") .trim(); } /** AuthorityCulpritId from GET /lookups/detection-accident-culprits. */ export function authorityCulpritIdFromDetectionRows( rows: unknown, ): number { const list = Array.isArray(rows) ? rows : []; const wanted = normalizeHullCaption( FANAVARAN_HULL_AUTHORITY_CULPRIT_CAPTION, ); for (const row of list) { if (!row || typeof row !== "object") continue; const caption = normalizeHullCaption( (row as { Caption?: unknown }).Caption, ); if (!caption.includes(wanted)) continue; const raw = (row as { Id?: unknown }).Id; const n = typeof raw === "number" ? raw : Number(raw); if (Number.isFinite(n) && n > 0) return n; } for (const row of list) { if (!row || typeof row !== "object") continue; const raw = (row as { Id?: unknown }).Id; const n = typeof raw === "number" ? raw : Number(raw); if (Number.isFinite(n) && n > 0) return n; } return FANAVARAN_DEFAULT_HULL_AUTHORITY_CULPRIT_ID; } /** Fallback AccidentCulpritId when parties inquiry is unavailable. */ export function customerIdFromHullPolicyRecord( policy: Record | null | undefined, ): number | null { if (!policy) return null; const raw = policy.CustomerId ?? policy.customerId; const n = typeof raw === "number" ? raw : Number(raw); return Number.isFinite(n) && n > 0 ? n : null; } export function toFanavaranHullBaseClaimPayload( built: Record, ): Record { const next: Record = {}; for (const key of FANAVARAN_HULL_BASE_CLAIM_KEYS) { if (key === "IsLicenseReplaced") { // GEN.03: must be empty/null. Do not map ثالث IsLicenseReplacement (default 0). next[key] = null; continue; } if (key === "AccidentTypeId") { next[key] = built.AccidentTypeId ?? FANAVARAN_DEFAULT_HULL_ACCIDENT_TYPE_ID; continue; } if (key === "CostSeparationToDmgSections") { next[key] = built.CostSeparationToDmgSections ?? FANAVARAN_HULL_ANS_NO; continue; } if (key === "IsOwnerChanged") { next[key] = built.IsOwnerChanged ?? FANAVARAN_HULL_ANS_NO; continue; } if (key === "CulpritTypeId") { const raw = built.CulpritTypeId; // ثالث profile default 337 is not in vehicle-hull-accident-culprit-type. if (raw == null || raw === 337) { next[key] = FANAVARAN_DEFAULT_HULL_CULPRIT_TYPE_ID; } else { next[key] = raw; } continue; } if (key === "CustomerFaultPercent") { next[key] = built.CustomerFaultPercent ?? FANAVARAN_DEFAULT_HULL_CUSTOMER_FAULT_PERCENT; continue; } if (key === "AuthorityCulpritId") { next[key] = built.AuthorityCulpritId ?? FANAVARAN_DEFAULT_HULL_AUTHORITY_CULPRIT_ID; continue; } next[key] = Object.prototype.hasOwnProperty.call(built, key) ? built[key] : null; } return next; } /** Nested hull files/expertise use GEN.03 `Id` (کد رایانه), never `ClaimNo` (شماره پرونده). */ export function fanavaranHullNestedClaimId(input: { Id?: unknown; ClaimNo?: unknown; claimId?: unknown; claimNo?: unknown; }): number | null { const id = input.claimId ?? input.Id; if (typeof id === "number" && Number.isFinite(id) && id > 0) return id; if (typeof id === "string" && /^\d+$/.test(id.trim())) return Number(id); return null; }