Files
fabric_trade_user/src/utils/orderTracking.ts
T
safavimohadeseh78andCursor 9e455c2572 Fix order tracking desktop layout and gate settlement until invoice pricing.
Show sidebar labels on tablet, improve theme-safe UI, and keep Jalali dates on tracking.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-09 14:32:10 +02:00

129 lines
4.6 KiB
TypeScript

import type { Order, OrderStatus } from '@/types'
import { ORDER_TRACKING_STEPS } from '@/utils/constants'
export type StatusHeroVariant = 'waiting' | 'success' | 'info' | 'none'
export interface StatusHeroConfig {
variant: StatusHeroVariant
title: string
description?: string
}
const STATUS_STEP_INDEX: Partial<Record<OrderStatus, number>> = {
submitted: 0,
awaiting_review: 1,
pricing: 2,
check_in_progress: 3,
awaiting_check_review: 4,
check_needs_fix: 4,
check_rejected: 4,
checks_approved: 5,
final_approved: 6,
cash_confirmed: 6,
preparing: 7,
ready_to_ship: 8,
shipped: 9,
delivered: 10,
}
const STATUS_HERO: Partial<Record<OrderStatus, StatusHeroConfig>> = {
submitted: {
variant: 'waiting',
title: 'پیش‌سفارش ثبت شد',
description:
'سفارش شما برای بررسی و قیمت‌گذاری به مدیریت ارسال شد. پس از صدور فاکتور می‌توانید روش تسویه (نقد یا چک) را انتخاب کنید.',
},
awaiting_review: {
variant: 'waiting',
title: 'در انتظار بررسی مدیریت',
description:
'پیش‌سفارش شما در صف بررسی است. پس از قیمت‌گذاری و صدور فاکتور، از طریق همین صفحه برای انتخاب تسویه مطلع می‌شوید.',
},
pricing: {
variant: 'waiting',
title: 'در حال قیمت‌گذاری',
description:
'مدیریت در حال تعیین مبلغ نهایی فاکتور است. تا قبل از صدور فاکتور امکان ثبت چک یا پرداخت وجود ندارد.',
},
awaiting_settlement: {
variant: 'info',
title: 'فاکتور آماده است',
description: 'مبلغ فاکتور مشخص شده. لطفاً روش تسویه را انتخاب کنید و مسیر پرداخت را ادامه دهید.',
},
awaiting_settlement_fix: {
variant: 'info',
title: 'نیاز به اصلاح تسویه',
description: 'لطفاً روش تسویه یا اطلاعات پرداخت را اصلاح کنید.',
},
awaiting_check_review: {
variant: 'waiting',
title: 'در حال بررسی چک‌ها',
description: 'چک‌های ثبت‌شده در حال بررسی هستند. نتیجه بررسی به‌زودی اعلام می‌شود.',
},
checks_approved: {
variant: 'success',
title: 'چک‌ها تأیید شده',
description: 'چک‌های شما توسط مدیریت تأیید شد. سفارش وارد مراحل بعدی می‌شود.',
},
cash_confirmed: {
variant: 'success',
title: 'پرداخت تأیید شد',
description: 'رسید پرداخت شما تأیید شد و سفارش وارد مراحل بعدی می‌شود.',
},
final_approved: {
variant: 'success',
title: 'تأیید نهایی',
description: 'سفارش شما تأیید نهایی شد و آماده آماده‌سازی است.',
},
preparing: {
variant: 'info',
title: 'در حال آماده‌سازی',
description: 'سفارش شما در انبار در حال آماده‌سازی است.',
},
ready_to_ship: {
variant: 'info',
title: 'آماده ارسال',
description: 'سفارش آماده ارسال است و به‌زودی تحویل باربری می‌شود.',
},
shipped: {
variant: 'info',
title: 'ارسال شده',
description: 'سفارش ارسال شده است. جزئیات بارنامه را می‌توانید مشاهده کنید.',
},
delivered: {
variant: 'success',
title: 'تحویل شده',
description: 'سفارش با موفقیت تحویل داده شد.',
},
}
export function getTrackingStepIndex(status: OrderStatus): number {
return STATUS_STEP_INDEX[status] ?? 1
}
export function getStatusHero(status: OrderStatus): StatusHeroConfig | null {
return STATUS_HERO[status] ?? null
}
export function getStepTimestamp(order: Order, stepStatus: OrderStatus): string | null {
if (stepStatus === 'submitted') {
return order.createdAt
}
const entry = [...order.statusHistory]
.reverse()
.find((item) => item.toStatus === stepStatus)
return entry?.changedAt ?? null
}
export function getTrackingFooterLabel(status: OrderStatus): string {
if (status === 'shipped') return 'مشاهده جزئیات و بارنامه'
if (['checks_approved', 'cash_confirmed', 'delivered', 'final_approved'].includes(status)) {
return 'مشاهده جزئیات'
}
return 'مشاهده جزئیات سفارش'
}
export { ORDER_TRACKING_STEPS }