Files
yara724-api/src/expert-insurer/helper/timeline-fa-labels.ts
2026-09-12 12:20:03 +03:30

286 lines
14 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Persian (Farsi) display labels for every timeline event `type` that can
* appear in a blame or claim history array.
*
* For generic `STEP_COMPLETED` / `V3_STEP_COMPLETED` events the label is
* derived from the `metadata.stepKey` value; those keys are listed at the
* bottom under STEP_KEY_FA_LABELS.
*
* Usage:
* const label = EVENT_TYPE_FA_LABELS[event.type]
* ?? resolveStepCompletedFaLabel(event)
* ?? "رویداد پرونده";
*/
// ---------------------------------------------------------------------------
// Blame-phase events (recorded on BlameRequest.history)
// ---------------------------------------------------------------------------
export const EVENT_TYPE_FA_LABELS: Record<string, string> = {
// File creation
FILE_CREATED_BY_REGISTRAR: "پرونده توسط ثبت‌کننده ایجاد شد",
FILE_CREATED_BY_FIELD_EXPERT: "پرونده توسط کارشناس میدانی ایجاد شد",
FILE_CREATED_BY_CALL_CENTER: "پرونده توسط اپراتور کال‌سنتر ایجاد شد",
// Expert link / OTP flow
LINK_SENT: "لینک ارسال شد",
CALL_CENTER_LINK_SENT: "لینک توسط اپراتور کال‌سنتر ارسال شد",
PARTY_OTP_SENT: "کد تأیید ارسال شد",
PARTY_OTP_VERIFIED: "کد تأیید تأیید شد",
PARTY_OTPS_VERIFIED: "کدهای تأیید هر دو طرف تأیید شدند",
SECOND_PARTY_OTP_SENT: "کد تأیید طرف دوم ارسال شد",
SECOND_PARTY_OTP_VERIFIED_ADVANCED: "کد طرف دوم تأیید و پیشرفت انجام شد",
// Confession / accident type
FIRST_BLAME_CONFESSION_SUBMITTED: "اقرار اولیه طرف اول ثبت شد",
CALL_CENTER_INQUIRY_COMPLETED: "استعلام کال‌سنتر تکمیل شد",
CAR_BODY_ACCIDENT_TYPE_SUBMITTED: "نوع تصادف بدنه خودرو ثبت شد",
AUTO_ADVANCED_TO_CAR_BODY_FORM: "پیشرفت خودکار به فرم بدنه خودرو",
AUTO_CONFESSION_SKIPPED: "مرحله اقرار به‌صورت خودکار رد شد",
// First video
FIRST_VIDEO_UPLOADED: "ویدیوی اول بارگذاری شد",
// Legacy first/second-party self-service flow
FIRST_INITIAL_FORM_SUBMITTED: "فرم اولیه طرف اول ثبت شد",
SECOND_INITIAL_FORM_SUBMITTED: "فرم اولیه طرف دوم ثبت شد",
FIRST_LOCATION_SUBMITTED: "موقعیت مکانی طرف اول ثبت شد",
SECOND_LOCATION_SUBMITTED: "موقعیت مکانی طرف دوم ثبت شد",
FIRST_VOICE_UPLOADED: "صدای طرف اول بارگذاری شد",
SECOND_VOICE_UPLOADED: "صدای طرف دوم بارگذاری شد",
FIRST_DESCRIPTION_SUBMITTED: "توضیحات طرف اول ثبت شد",
SECOND_DESCRIPTION_SUBMITTED: "توضیحات طرف دوم ثبت شد",
// Second party invitation
SECOND_PARTY_INVITED: "طرف دوم دعوت شد",
// Accident fields / expert in-person completion
ACCIDENT_FIELDS_SAVED: "اطلاعات تصادف ثبت شد",
ACCIDENT_FIELDS_SAVED_ADVANCED_TO_SIGNATURES:
"اطلاعات تصادف ذخیره و به مرحله امضاها پیشرفت شد",
EXPERT_COMPLETED_CAR_BODY_FORM_V2: "کارشناس فرم بدنه خودرو را تکمیل کرد",
EXPERT_COMPLETED_THIRD_PARTY_FORM_V2: "کارشناس فرم شخص ثالث را تکمیل کرد",
EXPERT_ADDED_LOCATIONS_V2: "کارشناس موقعیت مکانی را ثبت کرد",
EXPERT_UPLOADED_VIDEO_V2: "کارشناس ویدیو را بارگذاری کرد",
EXPERT_UPLOADED_VOICE_V2: "کارشناس صدا را بارگذاری کرد",
// Party rejection / disagreement
PARTY_REJECTED_EXPERT_DECISION: "طرف حساب با نظر کارشناس مخالفت کرد",
PARTIES_DISAGREED_ON_EXPERT_DECISION: "طرفین با نظر کارشناس توافق نکردند",
// Document resend (blame)
BLAME_DOCUMENT_RESEND_STARTED: "درخواست ارسال مجدد مدارک پرونده شروع شد",
BLAME_DOCUMENT_RESEND_CLEARED: "ارسال مجدد مدارک پرونده پاک‌سازی شد",
// Expert assignment (blame)
BLAME_ASSIGNED: "پرونده به کارشناس تخصیص داده شد",
AUTO_ASSIGNED_TO_EXPERT: "پرونده به‌صورت خودکار به کارشناس تخصیص یافت",
// Auto-assignment helpers
READY_FOR_EXPERT_EVALUATION: "پرونده آماده ارزیابی کارشناس شد",
SECOND_PARTY_DESCRIPTION_COMPLETED: "توضیحات طرف دوم تکمیل شد",
// V3 blame steps
V3_PARTY_SIGNATURE_RECORDED: "امضای طرف ثبت شد",
V3_ACCIDENT_FIELDS_SAVED: "اطلاعات تصادف ثبت شد",
V3_BLAME_ACCIDENT_VIDEO_UPLOADED: "ویدیوی تصادف بارگذاری شد",
V3_PARTY_VOICE_UPLOADED: "صدای طرف بارگذاری شد",
V3_PARTY_LOCATION_SAVED: "موقعیت مکانی طرف ذخیره شد",
V3_PARTY_DESCRIPTION_SAVED: "توضیحات طرف ذخیره شد",
V4_PARTY_DESCRIPTION_SAVED: "توضیحات طرف ذخیره شد",
V3_CAR_BODY_ACCIDENT_TYPE_SAVED: "نوع تصادف بدنه خودرو ذخیره شد",
// V5 blame steps
V5_BLAME_ACCIDENT_VIDEO_UPLOADED: "ویدیوی تصادف (نسخه ۵) بارگذاری شد",
V5_FILE_MAKER_APPROVED: "پرونده‌ساز پرونده را تأیید کرد",
V5_FILE_MAKER_REJECTED: "پرونده‌ساز پرونده را رد کرد",
V5_FILE_MAKER_REJECTED_BLAME_RESET:
"پرونده‌ساز پرونده را رد کرد و پرونده به مرحله قبل بازگردانده شد",
// ---------------------------------------------------------------------------
// Claim-phase events (recorded on ClaimCase.history)
// ---------------------------------------------------------------------------
// Claim creation
CLAIM_CREATED: "پرونده خسارت ایجاد شد",
// Expert assignment (claim)
CLAIM_ASSIGNED: "پرونده خسارت به کارشناس ارزیابی تخصیص داده شد",
// Expert actions on claim
EXPERT_RESEND_REQUESTED: "کارشناس درخواست ارسال مجدد مدارک داد",
EXPERT_RESEND_FULFILLED: "مدارک درخواستی ارسال شد",
IN_PERSON_VISIT_REQUESTED: "کارشناس بازدید حضوری درخواست کرد",
EXPERT_DAMAGED_PARTS_UPDATED: "کارشناس قطعات آسیب‌دیده را به‌روزرسانی کرد",
EXPERT_REPLY_SUBMITTED: "پاسخ کارشناس ثبت شد",
EXPERT_FINAL_REPLY_SUBMITTED: "پاسخ نهایی کارشناس ثبت شد",
FACTORS_REJECTED_REPRICED_AUTO_COMPLETED:
"بررسی فاکتورها با قیمت‌گذاری مجدد تکمیل شد",
FACTORS_VALIDATED_ALL_APPROVED_AUTO_COMPLETED:
"همه فاکتورها تأیید و پرونده تکمیل شد",
// Workflow steps (generic)
STEP_COMPLETED: "مرحله تکمیل شد",
V3_STEP_COMPLETED: "مرحله تکمیل شد",
// Documents & media
DOCUMENT_UPLOADED: "مدرک بارگذاری شد",
VIDEO_CAPTURE_UPLOADED: "تصویر ویدیویی بارگذاری شد",
PART_CAPTURED: "تصویر قطعه آسیب‌دیده بارگذاری شد",
ANGLE_CAPTURED: "تصویر زاویه خودرو بارگذاری شد",
ALL_FACTORS_UPLOADED_PENDING_VALIDATION:
"تمام فاکتورها بارگذاری شدند و در انتظار تأیید هستند",
// User responses
USER_OBJECTION_SUBMITTED: "اعتراض کاربر ثبت شد",
USER_RATING_SUBMITTED: "امتیاز کاربر ثبت شد",
// Owner insurer approval
OWNER_SIGNED_INSURER_APPROVAL: "صاحب خودرو قرارداد بیمه را امضا کرد",
OWNER_REJECTED_INSURER_APPROVAL_PRICING:
"صاحب خودرو قیمت‌گذاری بیمه را رد کرد",
OWNER_SIGNED_PRICED_PARTS_PENDING_FACTOR_UPLOAD:
"صاحب خودرو قطعات قیمت‌گذاری‌شده را امضا کرد و در انتظار بارگذاری فاکتور",
OWNER_REJECTED_PRICED_PARTS_BEFORE_FACTORS:
"صاحب خودرو قطعات قیمت‌گذاری‌شده را پیش از فاکتور رد کرد",
// Fanavaran sync
FANAVARAN_AUTO_SUBMIT_SUCCEEDED: "ارسال خودکار به فناوران موفق بود",
FANAVARAN_AUTO_SUBMIT_FAILED: "ارسال خودکار به فناوران ناموفق بود",
FANAVARAN_EARLY_AUTO_SUBMIT_SUCCEEDED:
"ارسال زودهنگام خودکار به فناوران موفق بود",
FANAVARAN_EARLY_AUTO_SUBMIT_FAILED:
"ارسال زودهنگام خودکار به فناوران ناموفق بود",
FANAVARAN_EXPERTISE_AUTO_SUBMIT_SUCCEEDED:
"ارسال خودکار کارشناسی به فناوران موفق بود",
FANAVARAN_EXPERTISE_AUTO_SUBMIT_FAILED:
"ارسال خودکار کارشناسی به فناوران ناموفق بود",
FANAVARAN_ATTACHMENT_AUTO_SUBMIT_SUCCEEDED:
"ارسال خودکار پیوست به فناوران موفق بود",
FANAVARAN_ATTACHMENT_AUTO_SUBMIT_FAILED:
"ارسال خودکار پیوست به فناوران ناموفق بود",
FANAVARAN_DAMAGE_CASE_AUTO_SUBMIT_SUCCEEDED:
"ارسال خودکار پرونده خسارت به فناوران موفق بود",
FANAVARAN_DAMAGE_CASE_AUTO_SUBMIT_FAILED:
"ارسال خودکار پرونده خسارت به فناوران ناموفق بود",
// V5 claim
V5_HELD_FOR_FILE_MAKER_APPROVAL: "پرونده در انتظار تأیید پرونده‌ساز متوقف شد",
};
// ---------------------------------------------------------------------------
// Persian labels for `metadata.stepKey` inside STEP_COMPLETED events
// ---------------------------------------------------------------------------
export const STEP_KEY_FA_LABELS: Record<string, string> = {
// Claim workflow steps
CLAIM_CREATED: "ایجاد پرونده خسارت",
SELECT_OUTER_PARTS: "انتخاب قطعات بیرونی آسیب‌دیده",
SELECT_OTHER_PARTS: "انتخاب سایر اطلاعات و قطعات",
CAPTURE_PART_DAMAGES: "عکس‌برداری از آسیب‌های قطعات",
UPLOAD_REQUIRED_DOCUMENTS: "بارگذاری مدارک مورد نیاز",
USER_SUBMISSION_COMPLETE: "ارسال اطلاعات توسط کاربر",
USER_EXPERT_RESEND: "ارسال مجدد مدارک توسط کاربر",
EXPERT_DAMAGE_ASSESSMENT: "ارزیابی خسارت توسط کارشناس",
EXPERT_FINAL_REPLY: "پاسخ نهایی کارشناس",
EXPERT_COST_EVALUATION: "ارزیابی هزینه توسط کارشناس",
OWNER_UPLOAD_FACTOR_DOCUMENTS: "بارگذاری فاکتورهای تعمیر توسط مالک",
INSURER_REVIEW: "بررسی توسط بیمه‌گر",
CLAIM_COMPLETED: "پرونده خسارت تکمیل شد",
};
const GENERIC_EVENT_FA_LABEL = "رویداد پرونده";
const GENERIC_EVENT_FA_DESCRIPTION = "رویدادی در روند پرونده ثبت شد.";
/**
* Persian descriptions for workflow-step events. These are deliberately
* complete sentences because the insurer timeline exposes them as the event
* detail, while `STEP_KEY_FA_LABELS` is intended for short UI labels.
*/
const STEP_KEY_FA_DESCRIPTIONS: Record<string, string> = {
CLAIM_CREATED: "پرونده خسارت ایجاد شد.",
SELECT_OUTER_PARTS: "قطعات بیرونی آسیب‌دیده انتخاب و ثبت شدند.",
SELECT_OTHER_PARTS: "سایر قطعات آسیب‌دیده و اطلاعات بانکی ثبت شدند.",
CAPTURE_PART_DAMAGES: "تصاویر آسیب قطعات و تصاویر مورد نیاز خودرو ثبت شدند.",
UPLOAD_REQUIRED_DOCUMENTS: "مدارک مورد نیاز برای بررسی خسارت بارگذاری شدند.",
USER_SUBMISSION_COMPLETE:
"ثبت اطلاعات کاربر تکمیل شد و پرونده آماده بررسی کارشناس خسارت است.",
USER_EXPERT_RESEND: "مدارک درخواستی توسط کاربر دوباره ارسال شدند.",
EXPERT_DAMAGE_ASSESSMENT: "ارزیابی خسارت توسط کارشناس انجام شد.",
EXPERT_FINAL_REPLY: "پاسخ نهایی کارشناس ثبت شد.",
EXPERT_COST_EVALUATION: "هزینه خسارت توسط کارشناس ارزیابی شد.",
OWNER_UPLOAD_FACTOR_DOCUMENTS: "فاکتورهای تعمیر توسط مالک بارگذاری شدند.",
INSURER_REVIEW: "پرونده توسط بیمه‌گر بررسی شد.",
CLAIM_COMPLETED: "رسیدگی به پرونده خسارت تکمیل شد.",
};
/**
* For `STEP_COMPLETED` and `V3_STEP_COMPLETED` events whose final label
* depends on the `metadata.stepKey` value, this function returns the
* most specific Persian label available.
*/
export function resolveStepCompletedFaLabel(event: {
type: string;
metadata?: any;
}): string | undefined {
if (event.type !== "STEP_COMPLETED" && event.type !== "V3_STEP_COMPLETED") {
return undefined;
}
const stepKey: string | undefined = event.metadata?.stepKey;
if (stepKey && STEP_KEY_FA_LABELS[stepKey]) {
return STEP_KEY_FA_LABELS[stepKey];
}
return "مرحله تکمیل شد";
}
/**
* Returns the best Persian label for any timeline event.
*/
export function getEventFaLabel(event: {
type: string;
metadata?: any;
}): string {
return (
resolveStepCompletedFaLabel(event) ??
EVENT_TYPE_FA_LABELS[event.type] ??
GENERIC_EVENT_FA_LABEL
);
}
/**
* Returns a Persian sentence suitable for the timeline event `description`.
*
* History is persisted over time, so its older metadata can contain English
* system messages. The insurer endpoint uses this derived value instead of
* exposing persisted text, which localizes both old and new timeline records.
*/
export function getEventFaDescription(event: {
type: string;
metadata?: any;
}): string {
const stepKey: string | undefined = event.metadata?.stepKey;
if (stepKey && STEP_KEY_FA_DESCRIPTIONS[stepKey]) {
return STEP_KEY_FA_DESCRIPTIONS[stepKey];
}
const label =
resolveStepCompletedFaLabel(event) ?? EVENT_TYPE_FA_LABELS[event.type];
return label ? `${label}.` : GENERIC_EVENT_FA_DESCRIPTION;
}
/**
* Keeps the established metadata contract intact. Only a pre-existing
* description field is localized; no keys are added, removed, or renamed.
*/
export function localizeTimelineMetadata(event: {
type: string;
metadata?: Record<string, unknown> | null;
}): Record<string, unknown> | null {
if (!event.metadata) return null;
return {
...event.metadata,
...(Object.prototype.hasOwnProperty.call(event.metadata, "description")
? { description: getEventFaDescription(event) }
: {}),
};
}