384 lines
11 KiB
TypeScript
384 lines
11 KiB
TypeScript
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 > 0 ؛ «ندارد» => amount = 0 */
|
|
export function hasProductUnitWeight(product?: ProductUnitSource | null) {
|
|
if (isMeltedTradeGroup(product?.group_type)) {
|
|
return false
|
|
}
|
|
|
|
const amount = Number(product?.amount ?? 0)
|
|
return amount > 0
|
|
}
|
|
|
|
/** ضریب قیمت — محصول بدون وزن قطعه همیشه ۱ */
|
|
export function productPriceAmountFactor(product?: ProductUnitSource | null) {
|
|
if (hasProductUnitWeight(product)) {
|
|
const amount = Number(product?.amount ?? 0)
|
|
return amount > 0 ? amount : 1
|
|
}
|
|
|
|
return 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
|
|
}
|