From bcf7b2f0aeca03e96ca6f29687bed4d2e8d4d417 Mon Sep 17 00:00:00 2001 From: adonis Date: Sat, 4 Jul 2026 22:13:37 +0330 Subject: [PATCH] added percent in product fee 5 --- src/components/BasicInput.vue | 3 +++ .../base/components/ProductEditorFormBody.vue | 10 ++++++---- .../products/base/hooks/productColumns.tsx | 18 +++--------------- src/utils/productCashFee.ts | 15 +++++++++++++-- 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/components/BasicInput.vue b/src/components/BasicInput.vue index c728193..0142cf0 100644 --- a/src/components/BasicInput.vue +++ b/src/components/BasicInput.vue @@ -11,6 +11,7 @@ :disabled="props.disabled" :placeHolder="props.placeHolder" :size="props.size" + :step="props.step" :type="props.type" class="" @change="handlerChange" @@ -23,6 +24,7 @@ :disabled="props.disabled" :placeHolder="props.placeHolder" :size="props.size" + :step="props.step" :type="props.type === 'price' ? 'tel' : props.type" class="" @change="handlerChange" @@ -48,6 +50,7 @@ interface Prop { addonBgColor?: String addonTextColor?: String placeHolder?: String + step?: String | Number } const addonBgColor = computed(() => props.addonBgColor) diff --git a/src/pages/menuPages/products/base/components/ProductEditorFormBody.vue b/src/pages/menuPages/products/base/components/ProductEditorFormBody.vue index 2f8f397..fbe149e 100644 --- a/src/pages/menuPages/products/base/components/ProductEditorFormBody.vue +++ b/src/pages/menuPages/products/base/components/ProductEditorFormBody.vue @@ -263,9 +263,10 @@ v-model:value="form.cash_fee_buy" :addon-before="form.cash_fee_buy_is_percent ? '%' : 'ریال'" :type="form.cash_fee_buy_is_percent ? 'number' : 'price'" + :step="form.cash_fee_buy_is_percent ? 'any' : undefined" size="large" class="w-full product-cash-fee-input" - :placeHolder="form.cash_fee_buy_is_percent ? 'مثلاً 5' : 'مثلاً 100000'" + :placeHolder="form.cash_fee_buy_is_percent ? 'مثلاً 0.5 یا 5' : 'مثلاً 100000'" /> @@ -286,9 +287,10 @@ v-model:value="form.cash_fee_sell" :addon-before="form.cash_fee_sell_is_percent ? '%' : 'ریال'" :type="form.cash_fee_sell_is_percent ? 'number' : 'price'" + :step="form.cash_fee_sell_is_percent ? 'any' : undefined" size="large" class="w-full product-cash-fee-input" - :placeHolder="form.cash_fee_sell_is_percent ? 'مثلاً 10' : 'مثلاً 200000'" + :placeHolder="form.cash_fee_sell_is_percent ? 'مثلاً 0.5 یا 10' : 'مثلاً 200000'" /> @@ -463,12 +465,12 @@ const inventoryHelp: DashboardHelp = { const cashFeeBuyHelp: DashboardHelp = { description: 'مبلغ اضافه روی قیمت پایه برای خرید — نقدی (ریال ثابت) یا درصدی از مظنه.', - formula: 'نقدی: +۱۰۰٬۰۰۰ ریال | درصدی: ۵٪ از قیمت پایه', + formula: 'نقدی: +۱۰۰٬۰۰۰ ریال | درصدی: ۰.۵٪ یا ۵٪ از قیمت پایه', } const cashFeeSellHelp: DashboardHelp = { description: 'مبلغ کسر از قیمت پایه برای فروش — نقدی (ریال ثابت) یا درصدی از مظنه.', - formula: 'نقدی: −۲۰۰٬۰۰۰ ریال | درصدی: ۱۰٪ از قیمت پایه', + formula: 'نقدی: −۲۰۰٬۰۰۰ ریال | درصدی: ۰.۵٪ یا ۱۰٪ از قیمت پایه', } const showInAssetsHelp: DashboardHelp = { diff --git a/src/pages/menuPages/products/base/hooks/productColumns.tsx b/src/pages/menuPages/products/base/hooks/productColumns.tsx index 00ce16e..792b96d 100644 --- a/src/pages/menuPages/products/base/hooks/productColumns.tsx +++ b/src/pages/menuPages/products/base/hooks/productColumns.tsx @@ -1,25 +1,13 @@ import type { BaseTableColumn } from '@core/type/baseTable' import CustomTag from '@/components/CustomTag.vue' import { isStoreApp } from '@/utils/config' +import { formatAdminCashFeeLabel } from '@/utils/productCashFee' import { usePrice } from '@core/utils/usePrice' function formatMoney(value: number | null | undefined) { return usePrice(value ?? 0, true, '').trim() } -function formatProductCashFee(value: number | null | undefined, isPercent?: boolean | null) { - const raw = Number(value ?? 0) - if (!raw) { - return '۰' - } - - if (isPercent) { - return `${raw}%` - } - - return formatMoney(raw) -} - const inventoryColumn: BaseTableColumn = { title: 'موجودی', dataIndex: 'inventory', @@ -99,14 +87,14 @@ export function getProductColumns(): BaseTableColumn[] { dataIndex: 'cash_fee_buy', key: 'cash_fee_buy', type: 'Number', - customRender: ({ record }) => formatProductCashFee(record.cash_fee_buy, record.cash_fee_buy_is_percent) + customRender: ({ record }) => formatAdminCashFeeLabel(record.cash_fee_buy, record.cash_fee_buy_is_percent) }, { title: 'هزینه فروش', dataIndex: 'cash_fee_sell', key: 'cash_fee_sell', type: 'Number', - customRender: ({ record }) => formatProductCashFee(record.cash_fee_sell, record.cash_fee_sell_is_percent) + customRender: ({ record }) => formatAdminCashFeeLabel(record.cash_fee_sell, record.cash_fee_sell_is_percent) }, ...(isStoreApp() ? [inventoryColumn] : []), { diff --git a/src/utils/productCashFee.ts b/src/utils/productCashFee.ts index 938c827..9ab1fff 100644 --- a/src/utils/productCashFee.ts +++ b/src/utils/productCashFee.ts @@ -1,10 +1,20 @@ /** پارس مقدار هزینه خرید/فروش (نقدی یا درصدی) قبل از ارسال به API */ +function normalizeDecimalString(value: string) { + const trimmed = value.trim() + if (!trimmed.includes(',') || trimmed.includes('.')) { + return trimmed.replaceAll(',', '') + } + + // 0,5 => 0.5 + return trimmed.replace(',', '.') +} + export function parseCashFeeValue(value: unknown): number { if (value === undefined || value === null) { return 0 } - const raw = String(value).trim().replaceAll(',', '') + const raw = normalizeDecimalString(String(value)) if (raw === '') { return 0 } @@ -31,7 +41,8 @@ export function formatAdminCashFeeLabel( } if (isPercent) { - return `${raw}%` + const text = Number.isInteger(raw) ? String(raw) : String(parseFloat(raw.toFixed(4))) + return `${text}%` } return String(raw)