forked from Yara724/api
fix: harden claim review and inquiry workflows
Preserve damage history and current vehicle price, restore depreciation mapping, normalize inquiry/report output, and support resumable expert review with paginated case retrieval.
This commit is contained in:
@@ -29,6 +29,7 @@ export const PR = {
|
||||
licenseType: "نوع گواهینامه",
|
||||
licenseDate: "تاریخ گواهینامه",
|
||||
licenseNumber: "شماره گواهینامه",
|
||||
hasDrivingLicense: "گواهینامه دارد",
|
||||
driverLicense: "گواهینامه راننده",
|
||||
insuranceCompany: "شرکت بیمه",
|
||||
policyNumber: "شماره بیمهنامه",
|
||||
@@ -194,6 +195,31 @@ const KEY_LABELS: Record<string, string> = {
|
||||
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<string, string> = {
|
||||
@@ -209,6 +235,76 @@ const STATUS_LABELS: Record<string, string> = {
|
||||
false: "خیر",
|
||||
};
|
||||
|
||||
const REGISTRATION_STATE_LABELS: Record<string, string> = {
|
||||
CURRENT: "عادی (پلاک فعلی)",
|
||||
RECENTLY_TRANSFERRED: "انتقال مالکیت اخیر",
|
||||
};
|
||||
|
||||
const PLATE_KIND_LABELS: Record<string, string> = {
|
||||
CURRENT: "پلاک فعلی",
|
||||
PREVIOUS: "پلاک قبلی",
|
||||
};
|
||||
|
||||
const PARTICIPANT_ROLE_VALUE_LABELS: Record<string, string> = {
|
||||
DRIVER: "راننده",
|
||||
VEHICLE_OWNER: "مالک وسیله نقلیه",
|
||||
THIRD_PARTY_POLICYHOLDER: "بیمهگذار شخص ثالث",
|
||||
CAR_BODY_POLICYHOLDER: "بیمهگذار بدنه",
|
||||
FIRST: "طرف اول",
|
||||
SECOND: "طرف دوم",
|
||||
};
|
||||
|
||||
const CASE_TYPE_LABELS: Record<string, string> = {
|
||||
THIRD_PARTY: "شخص ثالث",
|
||||
CAR_BODY: "بدنه",
|
||||
};
|
||||
|
||||
const VEHICLE_TYPE_LABELS: Record<string, string> = {
|
||||
SEDAN: "سواری",
|
||||
SUV: "شاسیبلند",
|
||||
HATCHBACK: "هاچبک",
|
||||
PICKUP: "وانت",
|
||||
VAN: "ون",
|
||||
};
|
||||
|
||||
const VALIDITY_LABELS: Record<string, string> = {
|
||||
ACTIVE: "فعال",
|
||||
INACTIVE: "غیرفعال",
|
||||
VALID: "معتبر",
|
||||
INVALID: "نامعتبر",
|
||||
EXPIRED: "منقضیشده",
|
||||
};
|
||||
|
||||
const DAMAGE_TYPE_LABELS: Record<string, string> = {
|
||||
REPAIR: "تعمیر",
|
||||
CHANGE: "تعویض",
|
||||
REPLACE: "تعویض",
|
||||
};
|
||||
|
||||
const INQUIRY_ERROR_LABELS: Record<string, string> = {
|
||||
NOT_FOUND: "موردی یافت نشد",
|
||||
NO_RECORD_FOUND: "موردی یافت نشد",
|
||||
TIMEOUT: "مهلت پاسخ استعلام به پایان رسید",
|
||||
REQUEST_FAILED: "استعلام ناموفق بود",
|
||||
FAILED: "استعلام ناموفق بود",
|
||||
UNAVAILABLE: "سرویس استعلام در دسترس نیست",
|
||||
};
|
||||
|
||||
const LICENSE_TYPE_LABELS: Record<string, string> = {
|
||||
"1": "پایه یک",
|
||||
"2": "پایه دو",
|
||||
"3": "پایه سه",
|
||||
BASE_1: "پایه یک",
|
||||
BASE1: "پایه یک",
|
||||
GRADE_1: "پایه یک",
|
||||
BASE_2: "پایه دو",
|
||||
BASE2: "پایه دو",
|
||||
GRADE_2: "پایه دو",
|
||||
BASE_3: "پایه سه",
|
||||
BASE3: "پایه سه",
|
||||
GRADE_3: "پایه سه",
|
||||
};
|
||||
|
||||
const WEATHER_LABELS: Record<string, string> = {
|
||||
clear: "صاف",
|
||||
sunny: "صاف",
|
||||
@@ -255,9 +351,39 @@ export function persianFieldPath(path: string): string {
|
||||
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}`;
|
||||
}
|
||||
|
||||
@@ -267,6 +393,51 @@ export function persianFieldPath(path: string): string {
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user