2026-07-08 18:24:55 +03:30
|
|
|
|
const PERSIAN_DIGITS = '۰۱۲۳۴۵۶۷۸۹'
|
|
|
|
|
|
const ARABIC_DIGITS = '٠١٢٣٤٥٦٧٨٩'
|
|
|
|
|
|
|
|
|
|
|
|
function toAsciiDigits(value: string): string {
|
|
|
|
|
|
return value
|
|
|
|
|
|
.replace(/[۰-۹]/g, (d) => String(PERSIAN_DIGITS.indexOf(d)))
|
|
|
|
|
|
.replace(/[٠-٩]/g, (d) => String(ARABIC_DIGITS.indexOf(d)))
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** پارس مبلغ محدودیت سفارش — ارقام فارسی/عربی و جداکننده هزارگان */
|
|
|
|
|
|
export function parseOrderLimitCashValue(value: unknown): number | undefined {
|
|
|
|
|
|
if (value === undefined || value === null || value === '') {
|
|
|
|
|
|
return undefined
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const raw = toAsciiDigits(String(value).trim().replace(/[,\s٬]/g, ''))
|
|
|
|
|
|
if (raw === '') {
|
|
|
|
|
|
return undefined
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const num = Number(raw)
|
|
|
|
|
|
if (!Number.isFinite(num) || num < 0) {
|
|
|
|
|
|
return undefined
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-26 19:57:10 +03:30
|
|
|
|
return Math.trunc(num)
|
2026-07-08 18:24:55 +03:30
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function orderLimitInputsPresent(form: {
|
|
|
|
|
|
min_order_cash?: number | string | null
|
|
|
|
|
|
max_order_cash?: number | string | null
|
|
|
|
|
|
}): boolean {
|
|
|
|
|
|
return (
|
|
|
|
|
|
(form.min_order_cash != null && form.min_order_cash !== '') ||
|
|
|
|
|
|
(form.max_order_cash != null && form.max_order_cash !== '')
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-07 10:58:23 +03:30
|
|
|
|
export function validateProductOrderLimitForm(form: {
|
|
|
|
|
|
order_limit_enabled?: boolean
|
|
|
|
|
|
min_order_cash?: number | string | null
|
|
|
|
|
|
max_order_cash?: number | string | null
|
|
|
|
|
|
}): string | null {
|
2026-07-08 18:24:55 +03:30
|
|
|
|
const enabled = !!form.order_limit_enabled || orderLimitInputsPresent(form)
|
|
|
|
|
|
if (!enabled) return null
|
2026-06-07 10:58:23 +03:30
|
|
|
|
|
2026-07-08 18:24:55 +03:30
|
|
|
|
const rawMin = form.min_order_cash
|
|
|
|
|
|
const rawMax = form.max_order_cash
|
|
|
|
|
|
const hasMinInput = rawMin != null && rawMin !== ''
|
|
|
|
|
|
const hasMaxInput = rawMax != null && rawMax !== ''
|
|
|
|
|
|
const min = parseOrderLimitCashValue(rawMin)
|
|
|
|
|
|
const max = parseOrderLimitCashValue(rawMax)
|
2026-06-07 10:58:23 +03:30
|
|
|
|
|
2026-07-08 18:24:55 +03:30
|
|
|
|
if (hasMinInput && min == null) {
|
|
|
|
|
|
return 'حداقل مبلغ سفارش نامعتبر است'
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (hasMaxInput && max == null) {
|
|
|
|
|
|
return 'حداکثر مبلغ سفارش نامعتبر است'
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (min == null && max == null) {
|
2026-06-07 10:58:23 +03:30
|
|
|
|
return 'با فعال بودن محدودیت مبلغ سفارش، حداقل یکی از حداقل یا حداکثر مبلغ باید وارد شود'
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-08 18:24:55 +03:30
|
|
|
|
if (min != null && max != null && min > max) {
|
2026-06-07 10:58:23 +03:30
|
|
|
|
return 'حداقل مبلغ نمیتواند بیشتر از حداکثر باشد'
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return null
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function normalizeProductOrderLimitForm<T extends Record<string, any>>(data: T): T {
|
2026-07-08 18:24:55 +03:30
|
|
|
|
const min = parseOrderLimitCashValue(data.min_order_cash)
|
|
|
|
|
|
const max = parseOrderLimitCashValue(data.max_order_cash)
|
|
|
|
|
|
const enabled = !!data.order_limit_enabled || min != null || max != null
|
|
|
|
|
|
|
|
|
|
|
|
data.order_limit_enabled = enabled
|
|
|
|
|
|
|
|
|
|
|
|
if (!enabled) {
|
2026-06-07 10:58:23 +03:30
|
|
|
|
data.min_order_cash = undefined
|
|
|
|
|
|
data.max_order_cash = undefined
|
|
|
|
|
|
} else {
|
2026-07-08 18:24:55 +03:30
|
|
|
|
data.min_order_cash = min
|
|
|
|
|
|
data.max_order_cash = max
|
2026-06-07 10:58:23 +03:30
|
|
|
|
}
|
2026-07-08 18:24:55 +03:30
|
|
|
|
|
2026-06-07 10:58:23 +03:30
|
|
|
|
return data
|
|
|
|
|
|
}
|