import type { SelectItem } from '@/models/SelectItem' import { isBoursecuProject } from '@/utils/config' import { useSettingsStore } from '@/store/settingsStore' import { isLegacyMaftolGroup, isMeltedTradeGroup, LEGACY_GROUP_KATOD, LEGACY_GROUP_MAFTOL, normalizeProductGroupType, PRODUCT_CATEGORY_ABSHODE, } from '@/utils/productCategories' /** @deprecated از isMeltedTradeGroup استفاده کنید */ export const BOURSECU_GROUP_ABSHODE = PRODUCT_CATEGORY_ABSHODE export const BOURSECU_GROUP_KATOD = LEGACY_GROUP_KATOD export const BOURSECU_GROUP_MAFTOL = LEGACY_GROUP_MAFTOL export const BOURSECU_WALLET_LABEL_GENERIC = 'موجودی کیف' export function isBoursecuDealProductGroup(groupType?: string | null) { if (!isBoursecuProject()) { return false } const group = normalizeProductGroupType(groupType) return group === BOURSECU_GROUP_MAFTOL || group === BOURSECU_GROUP_KATOD || group === BOURSECU_GROUP_ABSHODE || group === 'مس' } export function isMaftolMesGroup(groupType?: string | null) { const group = normalizeProductGroupType(groupType) return group === BOURSECU_GROUP_MAFTOL || (isBoursecuProject() && group === 'مس') } export function isKatodMesGroup(groupType?: string | null) { return normalizeProductGroupType(groupType) === BOURSECU_GROUP_KATOD } export function isGoldOnlyDealGroup(groupType?: string | null) { return isMeltedTradeGroup(groupType) } export interface ProductUnitSource { unit?: string | null direct_price?: number | null group_type?: string | null amount?: number | null } export function isWeightBasedProductUnit(unit?: string | null) { const value = (unit ?? '').trim() return value === 'کیلوگرم' || value === 'گرم' } const COUNT_BASED_GROUP_TYPES = ['سکه', 'گوی', 'مکعب', 'شمش', 'سکه پارسیان'] /** مطابق ادمین: وزن «دارد» یعنی amount مقدار واقعی است؛ «ندارد» یعنی amount = 1 */ export function hasProductUnitWeight(product?: ProductUnitSource | null) { const amount = Number(product?.amount ?? 0) return amount > 0 && amount !== 1 } export function getProductWeightUnit(product?: ProductUnitSource | null) { const unit = product?.unit?.trim() if (unit && isWeightBasedProductUnit(unit)) { return unit } if (isBoursecuProject()) { const group = normalizeProductGroupType(product?.group_type) if (group === BOURSECU_GROUP_MAFTOL || group === BOURSECU_GROUP_KATOD || group === BOURSECU_GROUP_ABSHODE || group === 'مس' || isMeltedTradeGroup(group)) { return getWeightUnit() } } if (!isCountBasedProduct(product) || isMeltedTradeGroup(product?.group_type)) { return getWeightUnit() } return 'گرم' } export function formatProductWeightAmount(amount?: number | null, product?: ProductUnitSource | null) { const value = Number(amount ?? 0) const weightUnit = getProductWeightUnit(product) if (weightUnit === 'گرم' && value > 0 && value < 1) { return `${value * 1000} سوت` } return `${value} ${weightUnit}` } export function getProductUnitWeightLabel(product?: ProductUnitSource | null) { if (!hasProductUnitWeight(product)) { return null } return formatProductWeightAmount(product?.amount, product) } export function getProductTotalWeightLabel(count?: number | null, product?: ProductUnitSource | null) { if (!hasProductUnitWeight(product)) { return null } const quantity = Number(count ?? 0) return formatProductWeightAmount(quantity * Number(product?.amount ?? 0), product) } export function shouldShowProductTotalWeight(product?: ProductUnitSource | null) { if (!product) { return false } if (!isCountBasedProduct(product)) { return true } return hasProductUnitWeight(product) } export function formatProductInventoryBalance(product?: (ProductUnitSource & { wallet?: { gold?: number | null } }) | null) { const count = product?.wallet?.gold ?? 0 const quantityPart = `${count} ${getProductQuantityUnit(product)}` const unitWeight = getProductUnitWeightLabel(product) if (!unitWeight) { return quantityPart } return `${quantityPart} · هر عدد ${unitWeight}` } /** محصول تعدادی: موجودی wallet.gold = تعداد قلم، نه وزن */ export function isCountBasedProduct(product?: ProductUnitSource | null) { if (!product) { return false } if (isWeightBasedProductUnit(product.unit)) { return false } if (product.direct_price != null && product.direct_price !== 0) { return true } const group = normalizeProductGroupType(product.group_type) if (group === BOURSECU_GROUP_MAFTOL || isLegacyMaftolGroup(group) || (isBoursecuProject() && group === 'مس')) { return true } return COUNT_BASED_GROUP_TYPES.includes(group) } export function getProductQuantityUnit(product?: ProductUnitSource | null) { const unit = product?.unit?.trim() if (unit) { return unit } if (isCountBasedProduct(product)) { return 'عدد' } return getWeightUnit() } function getDefaultTypeDealOptions(): SelectItem[] { const settingsStore = useSettingsStore() return [ { value: 'نقدی', key: 'cash' }, { value: settingsStore.metalTypeLabel, key: 'gold' }, ] } export function getProductDealMethodOptions(groupType?: string | null, isBuy = true): SelectItem[] { const settingsStore = useSettingsStore() if (!isBoursecuProject()) { if (isBuy) { return [ { value: 'نقدی', key: 'cash' }, { value: settingsStore.metalTypeLabel, key: 'gold' }, ] } return [ { value: 'نقدی', key: 'cash' }, { value: `دریافت ${settingsStore.metalTypeLabel}`, key: 'gold' }, ] } if (isMaftolMesGroup(groupType)) { if (isBuy) { return [ { value: `پرداخت با ${settingsStore.metalTypeLabel}`, key: 'katod' }, { value: 'نقدی', key: 'cash' }, ] } return [ { value: 'نقدی', key: 'cash' }, { value: `دریافت ${settingsStore.metalTypeLabel}`, key: 'katod' }, ] } if (isKatodMesGroup(groupType)) { return [{ value: 'نقدی', key: 'cash' }] } if (isMeltedTradeGroup(groupType)) { return [{ value: settingsStore.meltedGoldLabel, key: 'gold' }] } return getDefaultTypeDealOptions() } export function getDefaultProductDealMethod(groupType?: string | null, isBuy = true) { return getProductDealMethodOptions(groupType, isBuy)[0]?.key ?? 'cash' } export function getProductDealMethodPlaceholder(isBuy = true) { return isBuy ? 'نحوه خرید را انتخاب کنید' : 'نحوه دریافت را انتخاب کنید' } export function formatMainMetalReceiveText(weight?: number | null) { return `${useSettingsStore().metalTypeLabel}: ${weight ?? 0}${getWeightUnit()}` } export function calcSellReceivedMetalWeight( count?: number | null, product?: ProductUnitSource & { percent_fee_sell?: number | null } | null, ) { const quantity = Number(count ?? 0) const unitAmount = Number(product?.amount ?? 0) if (!quantity || !unitAmount) { return 0 } const grossAmount = quantity * unitAmount const feeRate = Number(product?.percent_fee_sell ?? 0) return grossAmount - feeRate * grossAmount } export function isCashLikeDealMethod(method?: string | null) { return method === 'cash' } export function isMainMetalWalletDealMethod(method?: string | null) { return method === 'gold' || method === 'katod' } /** برچسب کیف فلز اصلی (main wallet gold) — از setting metal_type */ export function getMainMetalWalletLabel() { return `موجودی کیف ${useSettingsStore().metalTypeLabel}` } /** برچسب کیف آبشده — از setting metal_type */ export function getMeltedGoldWalletLabel() { return `موجودی کیف ${useSettingsStore().meltedGoldLabel}` } export function getBoursecuMetalWalletLabel(groupType?: string | null) { const group = normalizeProductGroupType(groupType) if (group === BOURSECU_GROUP_MAFTOL) { return BOURSECU_GROUP_MAFTOL } if (group === BOURSECU_GROUP_KATOD) { return BOURSECU_GROUP_KATOD } if (group === BOURSECU_GROUP_ABSHODE) { return useSettingsStore().meltedGoldLabel } return useSettingsStore().metalTypeLabel } export function getGoldWalletLabel(groupType?: string | null) { if (!isBoursecuProject()) { return getMainMetalWalletLabel() } const group = normalizeProductGroupType(groupType) if (group === BOURSECU_GROUP_MAFTOL || group === BOURSECU_GROUP_KATOD || group === BOURSECU_GROUP_ABSHODE) { return `موجودی کیف ${getBoursecuMetalWalletLabel(groupType)}` } if (!group) { return getMainMetalWalletLabel() } return BOURSECU_WALLET_LABEL_GENERIC } /** پرداخت نقدی همیشه از کیف پول ریالی — مستقل از نوع محصول */ export function getCashWalletLabel(_groupType?: string | null) { return 'موجودی کیف پول' } export function getMetalAssetLabel() { return `دارایی ${useSettingsStore().metalTypeLabel}` } export function getMeltedGoldAssetLabel() { return `دارایی ${useSettingsStore().meltedGoldLabel}` } export function getMaftolAssetLabel() { return `دارایی ${BOURSECU_GROUP_MAFTOL}` } export function getWeightUnit() { return useSettingsStore().tradeWeightUnit } export function formatBoursecuAssetAmount(amount?: number | null) { return `${amount ?? 0}${getWeightUnit()}` } export function formatMainMetalWalletBalanceText(gold: number) { return `${getMainMetalWalletLabel()}: ${gold} ${getWeightUnit()}` } export function formatGoldWalletBalanceText(gold: number, groupType?: string | null) { return `${getGoldWalletLabel(groupType)}: ${gold} ${getWeightUnit()}` } export function formatCashWalletBalanceText(cashFormatted: string | number, groupType?: string | null) { return `${getCashWalletLabel(groupType)}: ${cashFormatted} ریال` } /** برچسب کیف فلزی متناسب با نحوه پرداخت (مثلاً کاتد مس برای خرید مفتول با کیف کاتد) */ export function getMetalWalletLabelForDealMethod(method?: string | null, groupType?: string | null) { if (!isBoursecuProject() || method === 'katod') { return getMainMetalWalletLabel() } return getGoldWalletLabel(groupType) } export function getInsufficientGoldWalletMessage(groupType?: string | null, method?: string | null) { return `${getMetalWalletLabelForDealMethod(method, groupType)} ناکافی است` } export function getInsufficientCashWalletMessage(_groupType?: string | null) { return `${getCashWalletLabel()} ناکافی است` } export function getInsufficientMainMetalWalletMessage() { return `${getMainMetalWalletLabel()} ناکافی است` } export function getMeltedGoldTradeLabel() { return useSettingsStore().meltedGoldLabel } export function getMetalTypeTradeLabel() { return useSettingsStore().metalTypeLabel } export function getTradePriceUnitLabel() { return useSettingsStore().metalTypeLabel }