diff --git a/apps/business/src/components/OrderStepModal.module.css b/apps/business/src/components/OrderStepModal.module.css index d8fb243..195e0aa 100644 --- a/apps/business/src/components/OrderStepModal.module.css +++ b/apps/business/src/components/OrderStepModal.module.css @@ -5,6 +5,17 @@ margin-bottom: 4px; } +.paymentHint { + margin: 0 0 12px; + padding: 10px 12px; + border-radius: var(--radius-sm); + background: rgba(var(--primary-rgb) / 0.06); + border: 1px solid rgba(var(--primary-rgb) / 0.18); + color: var(--text-muted); + font-size: 13px; + line-height: 1.45; +} + .stepOption { display: flex; align-items: center; diff --git a/apps/business/src/components/OrderStepModal.tsx b/apps/business/src/components/OrderStepModal.tsx index 91a5683..e7c715f 100644 --- a/apps/business/src/components/OrderStepModal.tsx +++ b/apps/business/src/components/OrderStepModal.tsx @@ -6,7 +6,10 @@ import { useToast } from '../context/ToastContext' import { useT } from '../i18n/useT' import { ApiError } from '../lib/api' import { updateOrder, type Order } from '../services/orderService' -import type { OrderProcessStep } from '../services/settingsService' +import { + isSystemPaymentProcessStep, + type OrderProcessStep, +} from '../services/settingsService' import { defaultStepColorForId, normalizeStepColor, stepBadgeStyle } from '../utils/stepColors' import modalStyles from './VariationsModal.module.css' import styles from './OrderStepModal.module.css' @@ -71,6 +74,7 @@ export function OrderStepModal({ async function handleSelectStep(stepId: string) { if (!order || savingStepId) return + if (isSystemPaymentProcessStep(stepId)) return if (stepId === order.processStepId) { onClose() @@ -104,6 +108,8 @@ export function OrderStepModal({ order.processStepLabel?.trim() || currentStep?.label || order.processStepId + const selectableSteps = steps.filter((step) => !isSystemPaymentProcessStep(step.id)) + const paymentIsCurrent = isSystemPaymentProcessStep(order.processStepId) return createPortal(
)} + {paymentIsCurrent && ( +

{t('orderStep.paymentHint')}

+ )} +
- {steps.map((step, index) => { + {selectableSteps.map((step, index) => { const selected = order.processStepId === step.id const saving = savingStepId === step.id const color = normalizeStepColor(step.color, defaultStepColorForId(step.id, index)) @@ -178,7 +188,7 @@ export function OrderStepModal({ })}
- {!steps.length && ( + {!selectableSteps.length && (

{t('orderStep.empty')}

)}
diff --git a/apps/business/src/i18n/messages.ts b/apps/business/src/i18n/messages.ts index 6b1d557..4f168df 100644 --- a/apps/business/src/i18n/messages.ts +++ b/apps/business/src/i18n/messages.ts @@ -1270,6 +1270,8 @@ const en = { 'orderStep.empty': 'No order steps configured. Add steps in Store settings first.', 'orderStep.updated': 'Order {orderNumber} step updated.', 'orderStep.error': 'Unable to update order step.', + 'orderStep.paymentHint': + 'Payment status is set automatically by the payment gateway. Choose a fulfillment step below.', 'orderItems.title': 'Order items', 'orderItems.customer': 'Customer', @@ -4143,6 +4145,8 @@ const fa: Record = { 'orderStep.empty': 'وضعیتی تعریف نشده است. ابتدا در تنظیمات فروشگاه وضعیت‌ها را اضافه کنید.', 'orderStep.updated': 'وضعیت سفارش {orderNumber} به‌روزرسانی شد.', 'orderStep.error': 'به‌روزرسانی وضعیت سفارش ممکن نشد.', + 'orderStep.paymentHint': + 'وضعیت پرداخت فقط توسط درگاه پرداخت به‌صورت خودکار تنظیم می‌شود. یکی از وضعیت‌های آماده‌سازی را انتخاب کنید.', 'orderItems.title': 'اقلام سفارش', 'orderItems.customer': 'مشتری', diff --git a/apps/business/src/services/settingsService.ts b/apps/business/src/services/settingsService.ts index fdd87f7..10c338f 100644 --- a/apps/business/src/services/settingsService.ts +++ b/apps/business/src/services/settingsService.ts @@ -146,6 +146,16 @@ export interface SettingsResponse { settings: BusinessSettings } +/** Set by payment gateway only — not selectable in admin status change. */ +export const SYSTEM_PAYMENT_PROCESS_STEP_IDS = [ + 'awaiting-payment', + 'payment-successful', +] as const + +export function isSystemPaymentProcessStep(stepId: string): boolean { + return (SYSTEM_PAYMENT_PROCESS_STEP_IDS as readonly string[]).includes(stepId) +} + export const DEFAULT_ORDER_PROCESS_STEPS: OrderProcessStep[] = [ { id: 'awaiting-payment',