81 lines
2.1 KiB
TypeScript
81 lines
2.1 KiB
TypeScript
import { ref } from 'vue'
|
|
|
|
export type SpecialPricingRule = {
|
|
product_id?: number
|
|
package_id: number
|
|
title: string
|
|
profit_buy: number
|
|
profit_sell: number
|
|
show_product: boolean
|
|
}
|
|
|
|
export type SpecialPricingPayload = {
|
|
enabled?: boolean
|
|
products?: SpecialPricingRule[]
|
|
board?: SpecialPricingRule | null
|
|
}
|
|
|
|
const state = ref<{
|
|
enabled: boolean
|
|
byProduct: Record<number, SpecialPricingRule>
|
|
board: SpecialPricingRule | null
|
|
}>({
|
|
enabled: false,
|
|
byProduct: {},
|
|
board: null,
|
|
})
|
|
|
|
export function setSpecialPricingPayload(payload?: SpecialPricingPayload | null) {
|
|
if (!payload || !payload.enabled) {
|
|
state.value = { enabled: false, byProduct: {}, board: null }
|
|
return
|
|
}
|
|
|
|
const byProduct: Record<number, SpecialPricingRule> = {}
|
|
for (const row of payload.products ?? []) {
|
|
const pid = Number(row.product_id ?? 0)
|
|
if (pid > 0) byProduct[pid] = row
|
|
}
|
|
|
|
state.value = {
|
|
enabled: true,
|
|
byProduct,
|
|
board: payload.board ?? null,
|
|
}
|
|
}
|
|
|
|
export function getSpecialPricingState() {
|
|
return state
|
|
}
|
|
|
|
/** اگر سرور قبلاً special_pricing نزده، اختلاف تابلو را روی last اعمال کن */
|
|
export function applyBoardSpecialToLastPayload<T extends Record<string, any>>(payload: T): T {
|
|
if (!payload || typeof payload !== 'object') return payload
|
|
if (payload.special_pricing) return payload
|
|
|
|
const board = state.value.board
|
|
if (!state.value.enabled || !board) return payload
|
|
|
|
const buyExtra = Number(board.profit_buy ?? 0)
|
|
const sellExtra = Number(board.profit_sell ?? 0)
|
|
if (buyExtra <= 0 && sellExtra <= 0) return payload
|
|
|
|
const next = { ...payload } as T & Record<string, any>
|
|
if (Number(next.buy ?? 0) > 0 && buyExtra > 0) {
|
|
next.buy = Number(next.buy) + buyExtra
|
|
}
|
|
if (Number(next.sell ?? 0) > 0 && sellExtra > 0) {
|
|
next.sell = Math.max(0, Number(next.sell) - sellExtra)
|
|
}
|
|
if (Number(next.price_last ?? 0) > 0 && buyExtra > 0) {
|
|
next.price_last = Number(next.price_last) + buyExtra
|
|
}
|
|
next.special_pricing = {
|
|
package_id: board.package_id,
|
|
title: board.title,
|
|
profit_buy: buyExtra,
|
|
profit_sell: sellExtra,
|
|
}
|
|
return next
|
|
}
|