fix fallback base on show product
This commit is contained in:
@@ -26,6 +26,7 @@ export interface Product {
|
|||||||
direct_price: number | undefined
|
direct_price: number | undefined
|
||||||
price_offset_percent?: number | null
|
price_offset_percent?: number | null
|
||||||
use_last_price_if_zero?: boolean
|
use_last_price_if_zero?: boolean
|
||||||
|
trade_by_quantity?: boolean
|
||||||
reading_method: any
|
reading_method: any
|
||||||
created_at: any
|
created_at: any
|
||||||
updated_at: any
|
updated_at: any
|
||||||
|
|||||||
@@ -32,6 +32,20 @@ export function isMeltedTradeGroup(groupType?: string | null) {
|
|||||||
return group === PRODUCT_CATEGORY_ABSHODE || LEGACY_MELTED_GROUP_TYPES.includes(group as typeof LEGACY_MELTED_GROUP_TYPES[number])
|
return group === PRODUCT_CATEGORY_ABSHODE || LEGACY_MELTED_GROUP_TYPES.includes(group as typeof LEGACY_MELTED_GROUP_TYPES[number])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface QuantityTradeProductSource {
|
||||||
|
group_type?: string | null
|
||||||
|
trade_by_quantity?: boolean | number | null
|
||||||
|
}
|
||||||
|
|
||||||
|
/** معامله مقداری: فقط فیلد trade_by_quantity — بدون وابستگی به دستهبندی */
|
||||||
|
export function usesQuantityTrade(product?: QuantityTradeProductSource | null) {
|
||||||
|
if (!product) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return product.trade_by_quantity === true || Number(product.trade_by_quantity) === 1
|
||||||
|
}
|
||||||
|
|
||||||
export function isMetalCommodityGroup(groupType?: string | null) {
|
export function isMetalCommodityGroup(groupType?: string | null) {
|
||||||
const group = normalizeProductGroupType(groupType)
|
const group = normalizeProductGroupType(groupType)
|
||||||
return group === 'مس' || group === 'نقره'
|
return group === 'مس' || group === 'نقره'
|
||||||
|
|||||||
@@ -56,10 +56,24 @@ export function isWeightBasedProductUnit(unit?: string | null) {
|
|||||||
|
|
||||||
const COUNT_BASED_GROUP_TYPES = ['سکه', 'گوی', 'مکعب', 'شمش', 'سکه پارسیان']
|
const COUNT_BASED_GROUP_TYPES = ['سکه', 'گوی', 'مکعب', 'شمش', 'سکه پارسیان']
|
||||||
|
|
||||||
/** مطابق ادمین: وزن «دارد» یعنی amount مقدار واقعی است؛ «ندارد» یعنی amount = 1 */
|
/** مطابق ادمین: وزن «دارد» => amount > 0 ؛ «ندارد» => amount = 0 */
|
||||||
export function hasProductUnitWeight(product?: ProductUnitSource | null) {
|
export function hasProductUnitWeight(product?: ProductUnitSource | null) {
|
||||||
|
if (isMeltedTradeGroup(product?.group_type)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
const amount = Number(product?.amount ?? 0)
|
const amount = Number(product?.amount ?? 0)
|
||||||
return amount > 0 && amount !== 1
|
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) {
|
export function getProductWeightUnit(product?: ProductUnitSource | null) {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import type { Product } from '@/models/products'
|
import type { Product } from '@/models/products'
|
||||||
import { getTradeBuyPrice, getTradeSellPrice, lastPrice } from '@/utils/price'
|
import { getTradeBuyPrice, getTradeSellPrice, lastPrice } from '@/utils/price'
|
||||||
import { isMetalCommodityGroup, isMeltedProductUsingAppPrice, isMeltedTradeGroup } from '@/utils/productCategories'
|
import { isMetalCommodityGroup, isMeltedProductUsingAppPrice, isMeltedTradeGroup, usesQuantityTrade } from '@/utils/productCategories'
|
||||||
|
import { productPriceAmountFactor } from '@/utils/productDealMethod'
|
||||||
|
|
||||||
function productUsesLastPriceIfZero(product: Product): boolean {
|
function productUsesLastPriceIfZero(product: Product): boolean {
|
||||||
return Boolean(product.use_last_price_if_zero)
|
return Boolean(product.use_last_price_if_zero)
|
||||||
@@ -89,13 +90,14 @@ export function getProductBuyPrice(product: Product): number {
|
|||||||
isMeltedProductUsingAppPrice(product)
|
isMeltedProductUsingAppPrice(product)
|
||||||
|| isMeltedTradeGroup(product.group_type)
|
|| isMeltedTradeGroup(product.group_type)
|
||||||
|| isMetalCommodityGroup(product.group_type)
|
|| isMetalCommodityGroup(product.group_type)
|
||||||
|
|| usesQuantityTrade(product)
|
||||||
) {
|
) {
|
||||||
return base + fee
|
return base + fee
|
||||||
}
|
}
|
||||||
|
|
||||||
const withFee = base + fee
|
const withFee = base + fee
|
||||||
return product.direct_price === 0
|
return product.direct_price === 0
|
||||||
? withFee * Number(product.amount ?? 0)
|
? withFee * productPriceAmountFactor(product)
|
||||||
: withFee
|
: withFee
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,7 +140,7 @@ export function getProductSellPrice(product: Product): number {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isMeltedProductUsingAppPrice(product) || isMeltedTradeGroup(product.group_type)) {
|
if (isMeltedProductUsingAppPrice(product) || isMeltedTradeGroup(product.group_type) || usesQuantityTrade(product)) {
|
||||||
return base - Number(product.cash_fee_sell ?? 0)
|
return base - Number(product.cash_fee_sell ?? 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -300,7 +300,7 @@ import { isStoreClosed, getStoreClosedMessage } from '@/utils/storeHours'
|
|||||||
import { formatCashWalletBalanceText, getWeightUnit } from '@/utils/productDealMethod'
|
import { formatCashWalletBalanceText, getWeightUnit } from '@/utils/productDealMethod'
|
||||||
import { formatProductWalletBalanceText, getCashWalletBalance, getProductInventoryQuantity } from '@/utils/productAssets'
|
import { formatProductWalletBalanceText, getCashWalletBalance, getProductInventoryQuantity } from '@/utils/productAssets'
|
||||||
import { useWalletAssets } from '@/composables/useWalletAssets'
|
import { useWalletAssets } from '@/composables/useWalletAssets'
|
||||||
import { isMeltedTradeGroup } from '@/utils/productCategories'
|
import { usesQuantityTrade } from '@/utils/productCategories'
|
||||||
import { useSettingsStore } from '@/store/settingsStore'
|
import { useSettingsStore } from '@/store/settingsStore'
|
||||||
import { storeToRefs } from 'pinia'
|
import { storeToRefs } from 'pinia'
|
||||||
import {
|
import {
|
||||||
@@ -381,7 +381,7 @@ const sellPagination = ref<TableEngineInput>({
|
|||||||
|
|
||||||
const unitPrice = computed(() => {
|
const unitPrice = computed(() => {
|
||||||
const product = props.ProductItem
|
const product = props.ProductItem
|
||||||
if (isMeltedTradeGroup(product?.group_type)) {
|
if (usesQuantityTrade(product)) {
|
||||||
return isBuy.value ? getProductBuyPrice(product!) : getProductSellPrice(product!)
|
return isBuy.value ? getProductBuyPrice(product!) : getProductSellPrice(product!)
|
||||||
}
|
}
|
||||||
return isBuy.value ? getTradeBuyPrice(lastPrice.value) : getTradeSellPrice(lastPrice.value)
|
return isBuy.value ? getTradeBuyPrice(lastPrice.value) : getTradeSellPrice(lastPrice.value)
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ const displayImage = computed(() => {
|
|||||||
<div class="m-1 flex flex-col gap-1 justify-center">
|
<div class="m-1 flex flex-col gap-1 justify-center">
|
||||||
<div class="text-base font-500">{{ props.ProductItem.title }}</div>
|
<div class="text-base font-500">{{ props.ProductItem.title }}</div>
|
||||||
<br>
|
<br>
|
||||||
<div v-if="isMeltedTradeGroup(props.ProductItem.group_type)">{{usePrice(goldPriceValue)}}</div>
|
<div v-if="usesQuantityTrade(props.ProductItem)">{{usePrice(goldPriceValue)}}</div>
|
||||||
<div v-else>{{usePrice(price)}}</div>
|
<div v-else>{{usePrice(price)}}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -111,6 +111,8 @@ import type {Product} from "@/models/products";
|
|||||||
import {usePrice} from "../../../../utils/usePrice";
|
import {usePrice} from "../../../../utils/usePrice";
|
||||||
import {computed, ref} from "vue";
|
import {computed, ref} from "vue";
|
||||||
import type {Price} from "@/models/home";
|
import type {Price} from "@/models/home";
|
||||||
|
import { usesQuantityTrade } from '@/utils/productCategories'
|
||||||
|
import { getProductBuyPrice } from '@/utils/productPrice'
|
||||||
|
|
||||||
interface Prop {
|
interface Prop {
|
||||||
ProductItem: Product
|
ProductItem: Product
|
||||||
@@ -132,6 +134,9 @@ const price = computed(()=>{
|
|||||||
const priceLast = computed((): Price => <Price>lastPrice.value ?? 0)
|
const priceLast = computed((): Price => <Price>lastPrice.value ?? 0)
|
||||||
|
|
||||||
const goldPriceValue = computed(() => {
|
const goldPriceValue = computed(() => {
|
||||||
|
if (usesQuantityTrade(props.ProductItem)) {
|
||||||
|
return getProductBuyPrice(props.ProductItem)
|
||||||
|
}
|
||||||
if (!priceLast.value) return 0
|
if (!priceLast.value) return 0
|
||||||
return priceLast.value.buy
|
return priceLast.value.buy
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<span class="dproducts-card__badge">{{ product.group_type }}</span>
|
<span class="dproducts-card__badge">{{ product.group_type }}</span>
|
||||||
<h3 class="dproducts-card__title">{{ product.title }}</h3>
|
<h3 class="dproducts-card__title">{{ product.title }}</h3>
|
||||||
<p class="dproducts-card__price">
|
<p class="dproducts-card__price">
|
||||||
<template v-if="isMeltedTradeGroup(product.group_type)">
|
<template v-if="usesQuantityTrade(product)">
|
||||||
{{ usePrice(goldPriceValue) }}
|
{{ usePrice(goldPriceValue) }}
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
@@ -37,7 +37,7 @@ import type { Product } from '@/models/products'
|
|||||||
import { usePrice } from '@/utils/usePrice'
|
import { usePrice } from '@/utils/usePrice'
|
||||||
import { getFileUrl } from '@/utils/file'
|
import { getFileUrl } from '@/utils/file'
|
||||||
import { getProductBuyPrice } from '@/utils/productPrice'
|
import { getProductBuyPrice } from '@/utils/productPrice'
|
||||||
import { isMeltedTradeGroup } from '@/utils/productCategories'
|
import { usesQuantityTrade } from '@/utils/productCategories'
|
||||||
|
|
||||||
const props = withDefaults(
|
const props = withDefaults(
|
||||||
defineProps<{
|
defineProps<{
|
||||||
@@ -70,12 +70,7 @@ const displayImage = computed(() => {
|
|||||||
return defaultImages[props.product.group_type] ?? defaultImg
|
return defaultImages[props.product.group_type] ?? defaultImg
|
||||||
})
|
})
|
||||||
|
|
||||||
const price = computed(() => {
|
const price = computed(() => getProductBuyPrice(props.product))
|
||||||
if (props.product.direct_price === 0) {
|
|
||||||
return ((props.product.price ?? 0) + (props.product.cash_fee_buy ?? 0)) * props.product.amount
|
|
||||||
}
|
|
||||||
return (props.product.price ?? 0) + (props.product.cash_fee_buy ?? 0)
|
|
||||||
})
|
|
||||||
|
|
||||||
const goldPriceValue = computed(() => getProductBuyPrice(props.product))
|
const goldPriceValue = computed(() => price.value)
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<BasicActionSheet v-if="!isDesktop" placement="bottom" v-model:show="showFilter">
|
<BasicActionSheet v-if="!isDesktop" placement="bottom" v-model:show="showFilter">
|
||||||
<div v-if="showFilter" :key="orderSheetKey">
|
<div v-if="showFilter" :key="orderSheetKey">
|
||||||
<indexGold
|
<indexGold
|
||||||
v-if="isMeltedTradeGroup(selectedProduct?.group_type)"
|
v-if="usesQuantityTrade(selectedProduct)"
|
||||||
:ProductItem="selectedProduct"
|
:ProductItem="selectedProduct"
|
||||||
/>
|
/>
|
||||||
<CopperSilver
|
<CopperSilver
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
>
|
>
|
||||||
<div v-if="showFilter" :key="orderSheetKey">
|
<div v-if="showFilter" :key="orderSheetKey">
|
||||||
<indexGold
|
<indexGold
|
||||||
v-if="isMeltedTradeGroup(selectedProduct?.group_type)"
|
v-if="usesQuantityTrade(selectedProduct)"
|
||||||
:ProductItem="selectedProduct"
|
:ProductItem="selectedProduct"
|
||||||
/>
|
/>
|
||||||
<CopperSilver
|
<CopperSilver
|
||||||
@@ -83,7 +83,7 @@ import DealProduct from '@/views/base/products/components/DealProduct.vue'
|
|||||||
import BasicModal from '@/components/BasicPacks/BasicModal.vue'
|
import BasicModal from '@/components/BasicPacks/BasicModal.vue'
|
||||||
import ResponsiveViewPair from '@/layouts/components/ResponsiveViewPair.vue'
|
import ResponsiveViewPair from '@/layouts/components/ResponsiveViewPair.vue'
|
||||||
import { useDesktopBreakpoint } from '@/layouts/composables/useAppLayout'
|
import { useDesktopBreakpoint } from '@/layouts/composables/useAppLayout'
|
||||||
import { isMetalCommodityGroup, isMeltedTradeGroup } from '@/utils/productCategories'
|
import { isMetalCommodityGroup, usesQuantityTrade } from '@/utils/productCategories'
|
||||||
import { isBoursecuDealProductGroup } from '@/utils/productDealMethod'
|
import { isBoursecuDealProductGroup } from '@/utils/productDealMethod'
|
||||||
import { useProductsPageProvider } from './composables/useProductsPage'
|
import { useProductsPageProvider } from './composables/useProductsPage'
|
||||||
import MobileProductsView from './mobile/MobileProductsView.vue'
|
import MobileProductsView from './mobile/MobileProductsView.vue'
|
||||||
|
|||||||
Reference in New Issue
Block a user