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',