Files
boursecu_user/src/views/base/transactions/config/boursecuTabs.ts
T
2026-07-21 10:57:54 +03:30

198 lines
5.4 KiB
TypeScript

import type { TableEngineInput } from '@/models/table'
export type BoursecuTransactionTabId =
| 'trades'
| 'deposit'
| 'withdrawal'
| 'physical'
export type BoursecuTradeSide = 'buy' | 'sell'
export type BoursecuTransactionFetchMode = 'transaction' | 'deposit' | 'physical'
export type BoursecuTradeStatusFilter = 'completed' | 'pending' | 'cancelled'
export type BoursecuFulfillmentStatusFilter = 'delivered' | 'registered' | 'cancelled'
export type BoursecuTransactionStatusFilter = BoursecuTradeStatusFilter | BoursecuFulfillmentStatusFilter
export type BoursecuStatusFilterGroup = 'trade' | 'fulfillment'
export interface BoursecuTransactionStatusOption {
value: string
label: string
sts: number
}
export interface BoursecuTransactionTab {
id: BoursecuTransactionTabId
label: string
emptyText: string
showTradeToggle?: boolean
showAdvancedFilters?: boolean
fetchMode?: BoursecuTransactionFetchMode
typeFilters?: number[]
}
export const BOURSECU_TRADE_STATUS_OPTIONS: BoursecuTransactionStatusOption[] = [
{ value: 'completed', label: 'تکمیل شده', sts: 2 },
{ value: 'pending', label: 'در انتظار تایید', sts: 1 },
{ value: 'cancelled', label: 'لغو شده', sts: 3 },
]
/** وضعیت‌های سند برداشت فیزیکی (Withdraw::$STS) */
export const BOURSECU_FULFILLMENT_STATUS_OPTIONS: BoursecuTransactionStatusOption[] = [
{ value: 'registered', label: 'در انتظار ارسال', sts: 50 },
{ value: 'delivered', label: 'ارسال شده', sts: 51 },
{ value: 'cancelled', label: 'لغو شده', sts: 52 },
]
/** @deprecated Use getBoursecuStatusOptionsForTab instead */
export const BOURSECU_TRANSACTION_STATUS_OPTIONS = BOURSECU_TRADE_STATUS_OPTIONS
export const BOURSECU_TRANSACTION_TABS: BoursecuTransactionTab[] = [
{
id: 'trades',
label: 'معاملات',
emptyText: 'معامله‌ای برای شما به ثبت نرسیده است',
showTradeToggle: true,
showAdvancedFilters: true,
typeFilters: [1, 2],
},
{
id: 'deposit',
label: 'واریز',
emptyText: 'واریزی برای شما به ثبت نرسیده است',
fetchMode: 'deposit',
showAdvancedFilters: true,
},
{
id: 'withdrawal',
label: 'برداشت',
emptyText: 'برداشتی برای شما به ثبت نرسیده است',
showAdvancedFilters: true,
typeFilters: [4],
},
{
id: 'physical',
label: 'تحویل فیزیکی',
emptyText: 'درخواست تحویل فیزیکی برای شما ثبت نشده است',
fetchMode: 'physical',
showAdvancedFilters: true,
},
]
const TRADE_TYPE_BY_SIDE: Record<BoursecuTradeSide, number> = {
buy: 1,
sell: 2,
}
export function getBoursecuStatusFilterGroup(tab: BoursecuTransactionTab): BoursecuStatusFilterGroup {
return tab.id === 'physical' ? 'fulfillment' : 'trade'
}
export function getBoursecuStatusOptionsForTab(
tab: BoursecuTransactionTab,
): BoursecuTransactionStatusOption[] {
return getBoursecuStatusFilterGroup(tab) === 'fulfillment'
? BOURSECU_FULFILLMENT_STATUS_OPTIONS
: BOURSECU_TRADE_STATUS_OPTIONS
}
export function boursecuTabSupportsProductFilter(tab: BoursecuTransactionTab): boolean {
// فیلتر محصول روی جدول سند برداشت فیزیکی (hasMany Transaction) قابل‌اعتماد نیست
return tab.id === 'trades'
}
function getBoursecuStatusFilterField(tab: BoursecuTransactionTab): string {
if (tab.fetchMode === 'deposit' || tab.fetchMode === 'physical') {
return 'sts'
}
if (tab.id === 'withdrawal') {
return 'withdraw.sts'
}
return 'order.sts'
}
function resolveBoursecuStatusSts(
tab: BoursecuTransactionTab,
statusFilter?: BoursecuTransactionStatusFilter | string,
): number | undefined {
return getBoursecuStatusOptionsForTab(tab).find((option) => option.value === statusFilter)?.sts
}
export function buildBoursecuTransactionPagination(
tab: BoursecuTransactionTab,
tradeSide: BoursecuTradeSide,
dateFrom?: string,
dateTo?: string,
statusFilter?: BoursecuTransactionStatusFilter | string,
productId?: number,
): TableEngineInput {
const filters: TableEngineInput['filters'] = []
if (tab.fetchMode !== 'deposit' && tab.fetchMode !== 'physical' && tab.typeFilters?.length) {
const typeValue =
tab.showTradeToggle && tab.typeFilters.includes(TRADE_TYPE_BY_SIDE[tradeSide])
? TRADE_TYPE_BY_SIDE[tradeSide]
: tab.typeFilters[0]
filters.push({
field: 'type',
cr: 'and',
type: 'number',
op: 'eq',
value: typeValue,
})
}
if (tab.showAdvancedFilters) {
if (dateFrom) {
filters.push({
field: 'created_at',
cr: 'and',
type: 'date',
op: 'gte',
value: dateFrom,
})
}
if (dateTo) {
filters.push({
field: 'created_at',
cr: 'and',
type: 'date',
op: 'lte',
value: dateTo,
})
}
const statusSts = resolveBoursecuStatusSts(tab, statusFilter)
if (statusSts != null) {
filters.push({
field: getBoursecuStatusFilterField(tab),
cr: 'and',
type: 'number',
op: 'eq',
value: statusSts,
})
}
if (productId != null && boursecuTabSupportsProductFilter(tab)) {
filters.push({
field: 'wallet.product_id',
cr: 'and',
type: 'number',
op: 'eq',
value: productId,
})
}
}
return {
page: 0,
limit: 7,
filters,
}
}