export const PR = { reportTitle: "گزارش پرونده بیمه گر", publicId: "شناسه عمومی", requestNo: "شماره درخواست", empty: "-", ownerSection: "مالک خودروی زیان دیده", guiltyOwnerSection: "مالک خودروی مقصر", damagedParticipantsSection: "اشخاص و نقش‌های خودروی زیان‌دیده", guiltyParticipantsSection: "اشخاص و نقش‌های خودروی مقصر", driverSection: "راننده خودروی زیان دیده", damagedThirdPartyInsuranceSection: "بیمه شخص ثالث زیان‌دیده", damagedCarBodyInsuranceSection: "بیمه بدنه زیان‌دیده", guiltyThirdPartyInsuranceSection: "بیمه شخص ثالث مقصر", guiltyCarBodyInsuranceSection: "بیمه بدنه مقصر", damagedVehicleSection: "اطلاعات خودروی زیان‌دیده", guiltyVehicleSection: "اطلاعات خودروی مقصر", vehicleSection: "اطلاعات خودرو", damagedStatementSection: "اظهارات و اقرار زیان‌دیده", guiltyStatementSection: "اظهارات و اقرار مقصر", timelineSection: "زمان‌بندی پرونده", fanavaranSection: "کدهای فناوران", evaluationSection: "نتیجه ارزیابی", accidentSection: "گزارش حادثه", name: "نام", phone: "شماره تلفن", nationalCode: "کد ملی", birthDate: "تاریخ تولد", sheba: "شماره شبا", licenseType: "نوع گواهینامه", licenseDate: "تاریخ گواهینامه", licenseNumber: "شماره گواهینامه", hasDrivingLicense: "گواهینامه دارد", driverLicense: "گواهینامه راننده", insuranceCompany: "شرکت بیمه", policyNumber: "شماره بیمه‌نامه", policyStartDate: "تاریخ شروع بیمه‌نامه", policyEndDate: "تاریخ پایان بیمه‌نامه", financialCeiling: "سقف تعهد مالی", coverages: "پوشش‌ها", fileRegisteredAt: "تاریخ و ساعت ثبت پرونده", evaluationRegisteredAt: "تاریخ و ساعت ثبت نتیجه ارزیابی", fanavaranClaimNo: "شماره پرونده فناوران", fanavaranClaimId: "کد پرونده فناوران", fanavaranDamageCaseId: "کد کیس خسارت فناوران", fanavaranExpertiseId: "کد کارشناسی فناوران", fanavaranPolicyId: "کد بیمه‌نامه فناوران", fanavaranDriverId: "کد راننده فناوران", fanavaranVehicleKindId: "کد نوع خودرو فناوران", fanavaranInsuranceCorpId: "کد شرکت بیمه فناوران", evaluationResult: "نتیجه ارزیابی", evaluationExpert: "کارشناس ارزیاب", evaluationSubmittedAt: "تاریخ و ساعت ثبت ارزیابی", evaluationResponse: "پاسخ / توضیحات کارشناس", evaluationPartsSection: "قیمت قطعات", part: "قطعه", partName: "نام قطعه", damageType: "نوع خسارت", partPrice: "قیمت قطعه", repairSalary: "اجرت تعمیر", totalPayment: "مبلغ کل", factorNeeded: "نیازمند فاکتور", daghi: "داغی", admitsGuilt: "اقرار به تقصیر", claimsDamage: "ادعای خسارت", acceptsExpertOpinion: "پذیرش نظر کارشناس", partyRole: "نقش طرف", driverRole: "راننده", vehicleOwnerRole: "مالک وسیله نقلیه", thirdPartyPolicyholderRole: "بیمه‌گذار شخص ثالث", carBodyPolicyholderRole: "بیمه‌گذار بدنه", data: "اطلاعات", date: "تاریخ", time: "زمان", accidentDate: "تاریخ حادثه", accidentTime: "ساعت حادثه", experts: "کارشناس(ان)", location: "موقعیت (عرض و طول جغرافیایی)", weather: "وضعیت آب و هوا", road: "وضعیت جاده", light: "وضعیت نور", blameStatus: "وضعیت مقصر", claimStatus: "وضعیت خسارت", expertDecision: "نظر کارشناس مقصر", accidentWay: "نحوه برخورد", accidentReason: "علت حادثه", accidentType: "نوع حادثه", damageExpertDate: "تاریخ ارزیابی کارشناس خسارت", damageExpertNotes: "توضیحات کارشناس خسارت", partyDescription: "توضیحات طرف", } as const; const KEY_LABELS: Record = { policyNumber: "شماره بیمه‌نامه", company: "شرکت بیمه", insurerCompany: "شرکت بیمه‌گر", startDate: "تاریخ شروع", endDate: "تاریخ پایان", financialCeiling: "سقف مالی", coverages: "پوشش‌ها", plateId: "پلاک", name: "نام", model: "مدل", type: "نوع", carName: "نام خودرو", carModel: "مدل خودرو", carType: "نوع خودرو", isNew: "خودرو نو", isNewCar: "خودرو نو", leftDigits: "دو رقم چپ پلاک", centerAlphabet: "حرف پلاک", centerDigits: "سه رقم وسط پلاک", ir: "کد ایران", plate: "پلاک", CompanyName: "نام شرکت", PolicyNumber: "شماره بیمه‌نامه", PolicyStartDate: "تاریخ شروع بیمه", PolicyEndDate: "تاریخ پایان بیمه", LicenseType: "نوع گواهینامه", licenseType: "نوع گواهینامه", IssueDate: "تاریخ صدور", issueDate: "تاریخ صدور", ExpireDate: "تاریخ انقضا", expireDate: "تاریخ انقضا", party: "طرف", insurance: "بیمه", carBodyInsurance: "بیمه بدنه", inquiry: "استعلام", thirdParty: "شخص ثالث", carBody: "بدنه", claim: "خسارت", vehicle: "خودرو", blame: "مقصر", items: "موارد", value: "مقدار", mapped: "نتیجه استعلام", has: "موجود", updatedAt: "به‌روزرسانی", source: "منبع", PrntPlcyCmpDocNo: "شماره سند شرکت", MapTypNam: "نام نوع خودرو", MtrNum: "شماره موتور", ShsNum: "شماره شاسی", vin: "VIN", VinNumberField: "VIN", DisFnYrPrcnt: "درصد تخفیف مالی", DisLfYrPrcnt: "درصد تخفیف جانی", DisPrsnYrPrcnt: "درصد تخفیف شخص ثالث", MapVehicleSystemName: "سیستم خودرو", LfCvrCptl: "سرمایه پوشش جانی", FnCvrCptl: "سرمایه پوشش مالی", PrsnCvrCptl: "سرمایه پوشش شخص ثالث", PersonCvrCptl: "سرمایه پوشش شخص", LifeCvrCptl: "سرمایه پوشش حیات", FinancialCvrCptl: "سرمایه پوشش مالی", VehicleSystemCode: "کد سیستم خودرو", CarGroupCode: "کد گروه خودرو", CylCnt: "تعداد سیلندر", LastCompanyDocumentNumber: "شماره سند آخرین شرکت", UsageCode: "کد کاربری", MapUsageCode: "کد کاربری نگاشت‌شده", MapUsageName: "نام کاربری", Plk1: "دو رقم چپ پلاک", Plk2: "حرف پلاک", Plk3: "سه رقم وسط پلاک", PlkSrl: "کد ایران پلاک", SystemField: "سیستم", TypeField: "تیپ", UsageField: "کاربری", MainColorField: "رنگ اصلی", SecondColorField: "رنگ فرعی", ModelField: "مدل", CapacityField: "ظرفیت", CacityField: "ظرفیت", CylinderNumberField: "تعداد سیلندر", EngineNumberField: "شماره موتور", ChassisNumberField: "شماره شاسی", InstallDateField: "تاریخ نصب", AxelNumberField: "تعداد محور", WheelNumberField: "تعداد چرخ", CompanyCode: "کد شرکت", SatrtDate: "تاریخ شروع", EndDate: "تاریخ پایان", PolicyHealthLossCount: "تعداد خسارت جانی", PolicyFinancialLossCount: "تعداد خسارت مالی", PolicyPersonLossCount: "تعداد خسارت شخص ثالث", Tonage: "تناژ", ThirdPolicyCode: "کد بیمه‌نامه ثالث", SystemCodeCii: "کد سیستم", SystemNameCii: "نام سیستم", TypeCodeCii: "کد نوع", TypeNameCii: "نام نوع", UsageNameCii: "نام کاربری", UsageCodeCii: "کد کاربری", ModelCii: "مدل", StatusTypeCode: "کد وضعیت", label_fa: "برچسب فارسی", catalogKey: "کلید کاتالوگ", participantId: "شناسه شخص", participants: "اشخاص استعلام", participantRoles: "نقش‌های اشخاص", nationalCode: "کد ملی", birthday: "تاریخ تولد", fullName: "نام و نام خانوادگی", phoneNumber: "شماره تلفن", hasDrivingLicense: "گواهینامه دارد", licenseNumber: "شماره گواهینامه", registrationState: "وضعیت پلاک و مالکیت", currentPlate: "پلاک فعلی", previousPlate: "پلاک قبلی", previousPlateId: "پلاک قبلی", previousPolicyholderNationalCode: "کد ملی بیمه‌گذار پلاک قبلی", vehicleVin: "شماره شاسی (VIN)", driver: "راننده", vehicleOwner: "مالک وسیله نقلیه", thirdPartyPolicyholder: "بیمه‌گذار شخص ثالث", carBodyPolicyholder: "بیمه‌گذار بدنه", sameAs: "همان شخص", plateKind: "نوع پلاک استعلام‌شده", succeeded: "موفق", usable: "قابل استفاده", attempts: "سوابق تلاش استعلام", error: "خطا", }; const STATUS_LABELS: Record = { AGREED: "توافق", DISAGREEMENT: "اختلاف نظر", UNKNOWN: "نامشخص", APPROVED: "تأیید شده", REJECTED: "رد شده", NEEDS_REVISION: "نیاز به بازبینی", UNDER_REVIEW: "در حال بررسی", PENDING: "در انتظار", true: "بله", false: "خیر", }; const REGISTRATION_STATE_LABELS: Record = { CURRENT: "عادی (پلاک فعلی)", RECENTLY_TRANSFERRED: "انتقال مالکیت اخیر", }; const PLATE_KIND_LABELS: Record = { CURRENT: "پلاک فعلی", PREVIOUS: "پلاک قبلی", }; const PARTICIPANT_ROLE_VALUE_LABELS: Record = { DRIVER: "راننده", VEHICLE_OWNER: "مالک وسیله نقلیه", THIRD_PARTY_POLICYHOLDER: "بیمه‌گذار شخص ثالث", CAR_BODY_POLICYHOLDER: "بیمه‌گذار بدنه", FIRST: "طرف اول", SECOND: "طرف دوم", }; const CASE_TYPE_LABELS: Record = { THIRD_PARTY: "شخص ثالث", CAR_BODY: "بدنه", }; const VEHICLE_TYPE_LABELS: Record = { SEDAN: "سواری", SUV: "شاسی‌بلند", HATCHBACK: "هاچ‌بک", PICKUP: "وانت", VAN: "ون", }; const VALIDITY_LABELS: Record = { ACTIVE: "فعال", INACTIVE: "غیرفعال", VALID: "معتبر", INVALID: "نامعتبر", EXPIRED: "منقضی‌شده", }; const DAMAGE_TYPE_LABELS: Record = { REPAIR: "تعمیر", CHANGE: "تعویض", REPLACE: "تعویض", }; const INQUIRY_ERROR_LABELS: Record = { NOT_FOUND: "موردی یافت نشد", NO_RECORD_FOUND: "موردی یافت نشد", TIMEOUT: "مهلت پاسخ استعلام به پایان رسید", REQUEST_FAILED: "استعلام ناموفق بود", FAILED: "استعلام ناموفق بود", UNAVAILABLE: "سرویس استعلام در دسترس نیست", }; const LICENSE_TYPE_LABELS: Record = { "1": "پایه یک", "2": "پایه دو", "3": "پایه سه", BASE_1: "پایه یک", BASE1: "پایه یک", GRADE_1: "پایه یک", BASE_2: "پایه دو", BASE2: "پایه دو", GRADE_2: "پایه دو", BASE_3: "پایه سه", BASE3: "پایه سه", GRADE_3: "پایه سه", }; const WEATHER_LABELS: Record = { clear: "صاف", sunny: "صاف", rainy: "بارانی", rain: "بارانی", snowy: "برفی", snow: "برفی", foggy: "مه‌آلود", fog: "مه‌آلود", }; const ROAD_LABELS: Record = { muddy: "گلی", icy: "یخ‌زده", wet: "مرطوب", dry: "خشک", }; const LIGHT_LABELS: Record = { daylight: "روز", day: "روز", night: "شب", low_light: "کم‌نور", lowlight: "کم‌نور", }; /** Turn `party.insurance.policyNumber` into a Persian label. */ export function persianFieldPath(path: string): string { if (!path) return PR.data; const parts = path.split(".").filter(Boolean); const last = parts[parts.length - 1] ?? path; const translatedLast = KEY_LABELS[last] ?? last; const inquiryRoot = parts.find( (p) => p === "thirdParty" || p === "carBody" || p === "mapped", ); if (inquiryRoot === "thirdParty") { return `بیمه شخص ثالث / ${translatedLast}`; } if (inquiryRoot === "carBody") { return `بیمه بدنه / ${translatedLast}`; } if (parts[0] === "party" && parts[1] === "insurance") { return `بیمه / ${translatedLast}`; } if (parts[0] === "claim" && parts[1] === "vehicle") { const attemptIndex = parts.indexOf("attempts"); if (attemptIndex >= 0) { const attemptNumber = Number(parts[attemptIndex + 1]); const attemptLabel = Number.isFinite(attemptNumber) ? `تلاش ${attemptNumber.toLocaleString("fa-IR")}` : "تلاش استعلام"; const plateLabel = parts.includes("plate") ? " / پلاک" : ""; return `خودرو / سوابق تلاش استعلام / ${attemptLabel}${plateLabel} / ${translatedLast}`; } if (parts.includes("currentPlate")) { return `خودرو / پلاک فعلی / ${translatedLast}`; } if (parts.includes("previousPlate")) { return `خودرو / پلاک قبلی / ${translatedLast}`; } return `خودرو / ${translatedLast}`; } if (parts[0] === "party" && parts[1] === "vehicle") { const attemptIndex = parts.indexOf("attempts"); if (attemptIndex >= 0) { const attemptNumber = Number(parts[attemptIndex + 1]); const attemptLabel = Number.isFinite(attemptNumber) ? `تلاش ${attemptNumber.toLocaleString("fa-IR")}` : "تلاش استعلام"; const plateLabel = parts.includes("plate") ? " / پلاک" : ""; return `خودرو / سوابق تلاش استعلام / ${attemptLabel}${plateLabel} / ${translatedLast}`; } if (parts.includes("currentPlate")) { return `خودرو / پلاک فعلی / ${translatedLast}`; } if (parts.includes("previousPlate")) { return `خودرو / پلاک قبلی / ${translatedLast}`; } return `خودرو / ${translatedLast}`; } if (parts.length === 1) return translatedLast; const translated = parts.map((part) => KEY_LABELS[part] ?? part); return translated.join(" / "); } /** * Localize only known domain tokens. Free-form provider values, names, * identifiers, plates and VINs are deliberately preserved verbatim. */ export function persianReportValue( path: string, value: unknown, ): unknown { if (value === undefined || value === null || value === "") return value; if (typeof value === "boolean") return value ? "بله" : "خیر"; if (typeof value !== "string" && typeof value !== "number") return value; const raw = String(value).trim(); const key = raw.toUpperCase().replace(/[\s-]+/g, "_"); const field = path.split(".").filter(Boolean).pop() ?? ""; if (field === "licenseType" || field === "LicenseType") { return LICENSE_TYPE_LABELS[key] ?? raw; } if (field === "registrationState") { return REGISTRATION_STATE_LABELS[key] ?? raw; } if (field === "plateKind") return PLATE_KIND_LABELS[key] ?? raw; if (field === "role" || field.endsWith("Role")) { return PARTICIPANT_ROLE_VALUE_LABELS[key] ?? raw; } if (field === "blameRequestType" || field === "fileType") { return CASE_TYPE_LABELS[key] ?? raw; } if ( (field === "carType" || field === "type") && path.toLowerCase().includes("vehicle") ) { return VEHICLE_TYPE_LABELS[key] ?? raw; } if (field === "typeOfDamage") return DAMAGE_TYPE_LABELS[key] ?? raw; if (field === "error") return INQUIRY_ERROR_LABELS[key] ?? raw; if (/status$/i.test(field)) { return STATUS_LABELS[raw] ?? VALIDITY_LABELS[key] ?? raw; } if (raw === "true" || raw === "false") return STATUS_LABELS[raw]; return raw; } export function persianStatus(value: unknown): string | undefined { if (value === undefined || value === null || value === "") return undefined; const key = String(value); return STATUS_LABELS[key] ?? key; } export function persianAccidentCondition( kind: "weather" | "road" | "light", value: unknown, ): string | undefined { if (value === undefined || value === null || value === "") return undefined; const raw = String(value).trim(); const normalized = raw.toLowerCase().replace(/[\s-]+/g, "_"); const labels = kind === "weather" ? WEATHER_LABELS : kind === "road" ? ROAD_LABELS : LIGHT_LABELS; return labels[normalized] ?? raw; }