104 lines
3.5 KiB
TypeScript
104 lines
3.5 KiB
TypeScript
import type { Product } from '@/models/products'
|
|
import { getTradeBuyPrice, getTradeSellPrice, lastPrice } from '@/utils/price'
|
|
|
|
/**
|
|
* قیمتگیری ماژولار محصول در حالت فروشگاهی (is_store=true).
|
|
*
|
|
* منبع حقیقت قیمت و وضعیت نمایش، سرور است: `/customer/product/list` و رویداد SSE
|
|
* `list` هر دو قیمت هر محصول (`price`/`price_profit`) و `show` را محاسبهشده میفرستند.
|
|
* این ماژول فقط همان قیمت سرور را میخواند و فقط برای آبشده وقتی قیمت سرور صفر است
|
|
* به قیمت زندهٔ مرجع (`lastPrice`) fallback میکند — هیچجا قیمت سرور بازنویسی نمیشود.
|
|
*/
|
|
|
|
const MELTED_GROUP = 'آبشده'
|
|
|
|
export function isMeltedProduct(product?: Product | null): boolean {
|
|
return product?.group_type === MELTED_GROUP
|
|
}
|
|
|
|
/** قیمت پایهٔ خرید (بدون کارمزد) — قیمت سرور، با fallback زندهٔ آبشده وقتی سرور صفر است */
|
|
export function getProductBaseBuyPrice(product?: Product | null): number {
|
|
if (!product) {
|
|
return 0
|
|
}
|
|
|
|
const serverPrice = Number(product.price ?? 0)
|
|
if (serverPrice > 0) {
|
|
return serverPrice
|
|
}
|
|
|
|
if (isMeltedProduct(product)) {
|
|
const liveBuy = getTradeBuyPrice(lastPrice.value)
|
|
if (liveBuy > 0) {
|
|
const amount = Number(product.amount ?? 0)
|
|
return amount > 0 ? liveBuy * amount : liveBuy
|
|
}
|
|
}
|
|
|
|
return 0
|
|
}
|
|
|
|
/** قیمت خرید نمایشی محصول (همان مقداری که در لیست و صفحهٔ محصول نشان داده میشود) */
|
|
export function getProductBuyPrice(product?: Product | null): number {
|
|
const base = getProductBaseBuyPrice(product)
|
|
if (base <= 0) {
|
|
return 0
|
|
}
|
|
|
|
return base + Number(product?.cash_fee_buy ?? 0)
|
|
}
|
|
|
|
/** قیمت پایهٔ فروش (بدون کارمزد) — قیمت فروش سرور، با fallback زندهٔ آبشده */
|
|
export function getProductBaseSellPrice(product?: Product | null): number {
|
|
if (!product) {
|
|
return 0
|
|
}
|
|
|
|
const serverSell = Number(product.sellPrice ?? 0)
|
|
if (serverSell > 0) {
|
|
return serverSell
|
|
}
|
|
|
|
if (isMeltedProduct(product)) {
|
|
const liveSell = getTradeSellPrice(lastPrice.value)
|
|
if (liveSell > 0) {
|
|
const amount = Number(product.amount ?? 0)
|
|
return amount > 0 ? liveSell * amount : liveSell
|
|
}
|
|
}
|
|
|
|
return getProductBaseBuyPrice(product)
|
|
}
|
|
|
|
/** قیمت فروش نمایشی محصول */
|
|
export function getProductSellPrice(product?: Product | null): number {
|
|
const base = getProductBaseSellPrice(product)
|
|
if (base <= 0) {
|
|
return 0
|
|
}
|
|
|
|
return base - Number(product?.cash_fee_sell ?? 0)
|
|
}
|
|
|
|
/** محصول وقتی قیمت پایهٔ معتبری ندارد، غیرفعال (غیرقابل معامله) است */
|
|
export function isProductPriceInactive(product?: Product | null): boolean {
|
|
return getProductBaseBuyPrice(product) <= 0
|
|
}
|
|
|
|
/**
|
|
* نمایش محصول در فروشگاه — اولویت با `show` سرور.
|
|
* فقط برای آبشدهای که قیمت سرورش هنوز نرسیده، با قیمت زنده تکمیل میکنیم.
|
|
*/
|
|
export function isProductVisible(product?: Product | null): boolean {
|
|
if (!product || product.active === false) {
|
|
return false
|
|
}
|
|
|
|
if (product.show) {
|
|
return true
|
|
}
|
|
|
|
// سازگاری: آبشدهای که سرور هنوز قیمت نداده ولی قیمت زنده موجود است
|
|
return isMeltedProduct(product) && getProductBaseBuyPrice(product) > 0
|
|
}
|