wallet fix 2

This commit is contained in:
2026-06-26 17:41:52 +03:30
parent edffc5df76
commit d7ca6706fb
11 changed files with 529 additions and 12 deletions
+1
View File
@@ -83,6 +83,7 @@ declare module '@vue/runtime-core' {
CustomTag: typeof import('./src/components/CustomTag.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
TahesabRetryModal: typeof import('./src/components/TahesabRetryModal.vue')['default']
ThemeMenuSection: typeof import('./src/core/components/ThemeMenuSection.vue')['default']
ThemeToggle: typeof import('./src/core/components/ThemeToggle.vue')['default']
UploadPic: typeof import('./src/components/UploadPic.vue')['default']
+36
View File
@@ -0,0 +1,36 @@
import useAxios from '@core/utils/useAxios'
import type { TableInput } from '@core/type/baseTable'
export interface TahesabRecord {
id: number
customer_id?: number
amount?: number
desc?: string
type?: string
sync_status?: 'pending' | 'success' | 'failed'
sync_log?: string | null
tahesab_id?: string | null
data?: string | null
res?: string | null
created_at?: string
customer?: {
id?: number
name?: string
mobile?: string
moshtari_code?: string | number | null
}
}
export const getTahesabTable = async (params: TableInput) =>
await useAxios.post<TahesabRecord[]>('/admin/tahesab/table', params)
export const getTahesabDetail = async (id: number) =>
await useAxios.get<TahesabRecord>(`/admin/tahesab/${id}`)
export const retryTahesabSanad = async (id: number) =>
await useAxios.post<{ ok: boolean; message: string; tahesab?: TahesabRecord }>(`/admin/tahesab/${id}/retry`)
export const registerCustomerInTahesab = async (customerId: number) =>
await useAxios.post<{ ok: boolean; message: string; moshtari_code?: string | number }>(
`/admin/customer/${customerId}/tahesab/register`
)
+126
View File
@@ -0,0 +1,126 @@
<template>
<BasicModal
v-model:visible="visible"
:title="title"
:ok-text="confirmText"
:loading="loading"
width="32rem"
@ok="confirm"
@close="visible = false"
>
<div class="space-y-3 text-sm">
<div v-for="item in items" :key="item.label" class="flex justify-between gap-3 border-b border-gray-100 pb-2">
<span class="text-gray-500">{{ item.label }}</span>
<span class="text-left break-all">{{ item.value ?? '-' }}</span>
</div>
<div v-if="logText" class="rounded-lg bg-red-50 p-3 text-red-700 whitespace-pre-wrap">{{ logText }}</div>
</div>
</BasicModal>
</template>
<script setup lang="ts">
import { computed, ref, watch } from 'vue'
import BasicModal from '@/components/BasicModal.vue'
import { message } from 'ant-design-vue/es'
import { getTahesabDetail, retryTahesabSanad, registerCustomerInTahesab, type TahesabRecord } from '@/api/tahesab'
const props = defineProps<{
modelValue: boolean
mode: 'retry-sanad' | 'register-customer'
tahesabId?: number
customerId?: number
customerName?: string
}>()
const emit = defineEmits<{
(e: 'update:modelValue', value: boolean): void
(e: 'success'): void
}>()
const loading = ref(false)
const detail = ref<TahesabRecord | null>(null)
const visible = computed({
get: () => props.modelValue,
set: (value: boolean) => emit('update:modelValue', value)
})
const title = computed(() =>
props.mode === 'register-customer' ? 'ثبت مشتری در ته‌حساب' : 'ارسال مجدد سند به ته‌حساب'
)
const confirmText = computed(() => (props.mode === 'register-customer' ? 'ثبت در ته‌حساب' : 'ارسال به ته‌حساب'))
const logText = computed(() => detail.value?.sync_log || '')
const items = computed(() => {
if (props.mode === 'register-customer') {
return [
{ label: 'نام مشتری', value: props.customerName || detail.value?.customer?.name },
{ label: 'شناسه مشتری', value: props.customerId || detail.value?.customer_id },
{ label: 'کد ته‌حساب', value: detail.value?.customer?.moshtari_code }
]
}
return [
{ label: 'شناسه سند', value: detail.value?.id },
{ label: 'مشتری', value: detail.value?.customer?.name },
{ label: 'موبایل', value: detail.value?.customer?.mobile },
{ label: 'نوع', value: detail.value?.type },
{ label: 'مقدار', value: detail.value?.amount },
{ label: 'شرح', value: detail.value?.desc },
{ label: 'وضعیت', value: statusLabel(detail.value?.sync_status) },
{ label: 'کد ته‌حساب', value: detail.value?.tahesab_id }
]
})
function statusLabel(status?: string) {
if (status === 'success') return 'موفق'
if (status === 'failed') return 'ناموفق'
return 'در انتظار'
}
watch(
() => [props.modelValue, props.tahesabId] as const,
async ([open, id]) => {
if (!open || props.mode !== 'retry-sanad' || !id) return
loading.value = true
try {
detail.value = await getTahesabDetail(id)
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
},
{ immediate: true }
)
async function confirm() {
loading.value = true
try {
if (props.mode === 'register-customer' && props.customerId) {
const result = await registerCustomerInTahesab(props.customerId)
if (!result.ok) {
message.error(result.message || 'ثبت مشتری ناموفق بود')
return
}
message.success(result.message || 'مشتری در ته‌حساب ثبت شد')
} else if (props.mode === 'retry-sanad' && props.tahesabId) {
const result = await retryTahesabSanad(props.tahesabId)
if (!result.ok) {
message.error(result.message || 'ارسال مجدد ناموفق بود')
detail.value = result.tahesab || detail.value
return
}
message.success(result.message || 'سند با موفقیت ثبت شد')
}
visible.value = false
emit('success')
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
}
</script>
+1
View File
@@ -36,5 +36,6 @@ export interface Customer {
trade_active: boolean
type_str: string
gold: number
moshtari_code?: string | number | null
// print_name: string
}
@@ -5,6 +5,24 @@
<BaseTable v-bind="tblProps" @register="submit" ref="tbl">
<template #action="{ record }">
<div class="flex justify-center gap-2">
<a-tooltip
v-if="showTahesab && record.tahesab_record_id"
placement="bottom"
class="cursor-pointer"
@click="openTahesabDetail(record)"
>
<template #title><span>جزئیات ته‌حساب</span></template>
<Icon icon="vuesax-linear:document-text" color="#10913A" />
</a-tooltip>
<a-tooltip
v-if="showTahesab && record.tahesab_failed_id"
placement="bottom"
class="cursor-pointer"
@click="openTahesabRetry(record)"
>
<template #title><span>ارسال به ته‌حساب</span></template>
<Icon icon="vuesax-linear:refresh-circle" color="#CA8A04" />
</a-tooltip>
<a-tooltip placement="bottom" class="cursor-pointer" @click="emits('info', record)">
<template #title><span>برداشت و واریز</span></template>
<Icon icon="vuesax-linear:stickynote" color="#10913A" />
@@ -25,22 +43,53 @@
@orders="emits('orders', $event)"
/>
</BasicShowContext>
<TahesabRetryModal
v-if="showTahesab"
v-model="tahesabRetryVisible"
mode="retry-sanad"
:tahesab-id="selectedTahesabId"
@success="fetch"
/>
<BasicModal
v-if="showTahesab"
v-model:visible="tahesabDetailVisible" title="جزئیات سند ته‌حساب" width="36rem" :footer="null">
<div class="space-y-2 text-sm">
<div v-for="item in tahesabDetailItems" :key="item.label" class="flex justify-between gap-3 border-b border-gray-100 py-2">
<span class="text-gray-500">{{ item.label }}</span>
<span class="break-all text-left">{{ item.value ?? '-' }}</span>
</div>
<div v-if="tahesabDetail?.sync_log" class="rounded-lg bg-red-50 p-3 text-red-700 whitespace-pre-wrap">
{{ tahesabDetail.sync_log }}
</div>
</div>
</BasicModal>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { computed, ref, watch } from 'vue'
import { getTotalAccountingTable } from '@/api/accounting'
import { getTahesabDetail, type TahesabRecord } from '@/api/tahesab'
import { getAccountingColumns } from '@/pages/menuPages/accounting/hooks/accountingColumns'
import AccountingMobileCardList from '@/pages/menuPages/accounting/components/AccountingMobileCardList.vue'
import Icon from '@core/components/BaseIcon/src/Icon.vue'
import useBaseTable from '@core/components/BaseTable/hooks/useBaseTable'
import type { TableInput } from '@core/type/baseTable'
import { isMobile } from '@core/utils/is'
import TahesabRetryModal from '@/components/TahesabRetryModal.vue'
import BasicModal from '@/components/BasicModal.vue'
defineProps<{
customerId?: number
}>()
const props = withDefaults(
defineProps<{
customerId?: number
showTahesab?: boolean
}>(),
{
showTahesab: false
}
)
const emits = defineEmits<{
(e: 'info', record: unknown): void
@@ -49,12 +98,45 @@ const emits = defineEmits<{
const [submit, reload] = useBaseTable()
const mobileListRef = ref<null | { fetch: () => Promise<void> }>(null)
const tahesabRetryVisible = ref(false)
const tahesabDetailVisible = ref(false)
const selectedTahesabId = ref<number>()
const tahesabDetail = ref<TahesabRecord | null>(null)
const tahesabDetailItems = computed(() => {
const row = tahesabDetail.value
if (!row) return []
return [
{ label: 'شناسه', value: row.id },
{ label: 'مشتری', value: row.customer?.name },
{ label: 'نوع', value: row.type },
{ label: 'مقدار', value: row.amount },
{ label: 'شرح', value: row.desc },
{ label: 'وضعیت', value: tahesabStatusLabel(row) },
{ label: 'کد ته‌حساب', value: row.tahesab_id }
]
})
function tahesabStatusLabel(row?: TahesabRecord | null) {
if (!row) return '-'
if (row.tahesab_id) return 'موفق'
if (row.sync_status === 'failed') return 'ناموفق'
if (row.sync_status === 'success') return 'موفق'
return 'در انتظار'
}
const tblProps = ref({
columns: getAccountingColumns(),
columns: getAccountingColumns(props.showTahesab),
api: (params: TableInput) => getTotalAccountingTable(params)
})
watch(
() => props.showTahesab,
(enabled) => {
tblProps.value.columns = getAccountingColumns(enabled)
}
)
async function fetch() {
if (isMobile.value) {
await mobileListRef.value?.fetch?.()
@@ -63,5 +145,22 @@ async function fetch() {
await reload()
}
function openTahesabRetry(record: { tahesab_failed_id?: number }) {
if (!record.tahesab_failed_id) return
selectedTahesabId.value = record.tahesab_failed_id
tahesabRetryVisible.value = true
}
async function openTahesabDetail(record: { tahesab_record_id?: number }) {
if (!record.tahesab_record_id) return
selectedTahesabId.value = record.tahesab_record_id
try {
tahesabDetail.value = await getTahesabDetail(record.tahesab_record_id)
tahesabDetailVisible.value = true
} catch (e) {
console.error(e)
}
}
defineExpose({ fetch })
</script>
@@ -0,0 +1,134 @@
<template>
<div class="min-w-0 w-full max-w-full overflow-x-hidden">
<BasicShowContext title="اسناد ته‌حساب">
<div v-if="!isMobile" class="min-w-0 w-full max-w-full overflow-x-auto">
<BaseTable v-bind="tblProps" @register="submit" ref="tbl">
<template #action="{ record }">
<div class="flex justify-center gap-2">
<a-tooltip placement="bottom" class="cursor-pointer" @click="openDetail(record)">
<template #title><span>جزئیات</span></template>
<Icon icon="vuesax-linear:stickynote" color="#10913A" />
</a-tooltip>
<a-tooltip
v-if="canRetry(record)"
placement="bottom"
class="cursor-pointer"
@click="openRetry(record)"
>
<template #title><span>ارسال به ته‌حساب</span></template>
<Icon icon="vuesax-linear:refresh-circle" color="#CA8A04" />
</a-tooltip>
</div>
</template>
</BaseTable>
</div>
</BasicShowContext>
<BasicModal v-model:visible="detailVisible" title="جزئیات سند ته‌حساب" width="36rem" :footer="null">
<div class="space-y-2 text-sm">
<div v-for="item in detailItems" :key="item.label" class="flex justify-between gap-3 border-b border-gray-100 py-2">
<span class="text-gray-500">{{ item.label }}</span>
<span class="break-all text-left">{{ item.value ?? '-' }}</span>
</div>
<div v-if="selected?.sync_log" class="rounded-lg bg-red-50 p-3 text-red-700 whitespace-pre-wrap">
{{ selected.sync_log }}
</div>
</div>
</BasicModal>
<TahesabRetryModal
v-model="retryVisible"
mode="retry-sanad"
:tahesab-id="selected?.id"
@success="fetch"
/>
</div>
</template>
<script setup lang="ts">
import { computed, ref } from 'vue'
import useBaseTable from '@core/components/BaseTable/hooks/useBaseTable'
import type { TableInput } from '@core/type/baseTable'
import { getTahesabTable, type TahesabRecord } from '@/api/tahesab'
import Icon from '@core/components/BaseIcon/src/Icon.vue'
import { isMobile } from '@core/utils/is'
import BasicModal from '@/components/BasicModal.vue'
import TahesabRetryModal from '@/components/TahesabRetryModal.vue'
import { toJalali } from '@core/utils/useDataTime'
const [submit, reload] = useBaseTable()
const detailVisible = ref(false)
const retryVisible = ref(false)
const selected = ref<TahesabRecord | null>(null)
const columns = [
{ title: 'ردیف', dataIndex: 'id', key: 'id', filterable: false, sortable: false, customRender: (r: any) => r.index + 1 },
{ title: 'مشتری', dataIndex: 'customer.name', key: 'customer.name', type: 'Text' },
{ title: 'نوع', dataIndex: 'type', key: 'type', type: 'Text' },
{ title: 'مقدار', dataIndex: 'amount', key: 'amount', type: 'Number' },
{ title: 'شرح', dataIndex: 'desc', key: 'desc', type: 'Text' },
{
title: 'وضعیت',
dataIndex: 'sync_status',
key: 'sync_status',
type: 'Text',
customRender: (r: any) => statusLabel(r.record.sync_status, r.record.tahesab_id)
},
{
title: 'زمان',
dataIndex: 'created_at',
key: 'created_at',
type: 'Text',
customRender: (r: any) => toJalali(r.record.created_at)
},
{ title: 'عملیات', dataIndex: 'action', key: 'action', slot: 'action', filterable: false }
]
const tblProps = ref({
columns,
api: (params: TableInput) => getTahesabTable(params)
})
const detailItems = computed(() => {
const row = selected.value
if (!row) return []
return [
{ label: 'شناسه', value: row.id },
{ label: 'مشتری', value: row.customer?.name },
{ label: 'موبایل', value: row.customer?.mobile },
{ label: 'نوع', value: row.type },
{ label: 'مقدار', value: row.amount },
{ label: 'شرح', value: row.desc },
{ label: 'وضعیت', value: statusLabel(row.sync_status, row.tahesab_id) },
{ label: 'کد ته‌حساب', value: row.tahesab_id },
{ label: 'پاسخ API', value: row.res }
]
})
function statusLabel(status?: string, tahesabId?: string | null) {
if (tahesabId) return 'موفق'
if (status === 'failed') return 'ناموفق'
if (status === 'success') return 'موفق'
return 'در انتظار'
}
function canRetry(record: TahesabRecord) {
return !record.tahesab_id || record.sync_status === 'failed'
}
function openDetail(record: TahesabRecord) {
selected.value = record
detailVisible.value = true
}
function openRetry(record: TahesabRecord) {
selected.value = record
retryVisible.value = true
}
async function fetch() {
await reload()
}
defineExpose({ fetch })
</script>
@@ -22,7 +22,7 @@ const filteredDocTypes: FilterSelect = docTypes?.map((x: DocItem) => {
}
})*/
export function getAccountingColumns(): BaseTableColumn[] {
export function getAccountingColumns(showTahesab = false): BaseTableColumn[] {
return [
{
title: 'ردیف',
@@ -76,6 +76,25 @@ export function getAccountingColumns(): BaseTableColumn[] {
key: 'note',
type: 'Text',
},
...(showTahesab
? [
{
title: 'ته‌حساب',
dataIndex: 'tahesab_sync_status',
key: 'tahesab_sync_status',
type: 'Text',
filterable: false,
customRender: (record: any) => {
const row = record.record
if (!row.tahesab_record_id && !row.tahesab_sync_status) return '-'
if (row.tahesab_failed_id) return 'ناموفق'
if (row.tahesab_sync_status === 'success') return 'موفق'
if (row.tahesab_sync_status === 'pending') return 'در انتظار'
return row.tahesab_sync_status ?? '-'
}
} as BaseTableColumn
]
: []),
{
title: 'عملیات',
dataIndex: 'action',
+19 -6
View File
@@ -1,12 +1,20 @@
<template>
<div>
<BasicMainCard>
<div class="flex h-full w-full min-w-0 max-w-full overflow-x-hidden">
<tbl ref="table" class="h-full w-full min-w-0" @info="onAccountingWithdraw" @orders="onAccountingOrders" />
<!-- <BasicMenu :menu="menu" width="13rem" @onChange="tabSelected" />
<component :is="selectedComponent" class="mr-5" />-->
<!-- <BasicShowContext title="پروژه ها"> <Search /> </BasicShowContext>-->
<div class="flex h-full w-full min-w-0 max-w-full flex-col overflow-x-hidden">
<ATabs v-if="tahesabEnabled" v-model:activeKey="activeTab" class="mb-3 shrink-0">
<ATabPane key="reports" tab="گزارشات" />
<ATabPane key="tahesab" tab="اسناد ته‌حساب" />
</ATabs>
<tbl
v-if="!tahesabEnabled || activeTab === 'reports'"
ref="table"
class="min-h-0 flex-1"
:show-tahesab="tahesabEnabled"
@info="onAccountingWithdraw"
@orders="onAccountingOrders"
/>
<tahesabTbl v-else-if="tahesabEnabled" ref="tahesabTable" class="min-h-0 flex-1" />
</div>
</BasicMainCard>
<BasicModal
@@ -126,6 +134,7 @@ import { inputLenRules, inputRules, inputRulesNumber } from '@/utils/inputRules'
import { useStaticApiListsStore } from '@/store/staticApisStore'
import { ref } from 'vue'
import tbl from './components/table.vue'
import tahesabTbl from './components/tahesabTable.vue'
import type { FormInstance } from 'ant-design-vue'
import BasicInfoModal from '@/components/BasicInfoModal/index.vue'
import { message } from 'ant-design-vue/es'
@@ -144,9 +153,12 @@ import type { last } from '@/model/price'
import { createOrder } from '@/api/order'
import { getCashBalance, getGoldBalance } from '@/components/mobile/utils/wallet'
import { metalLabel } from '@/utils/adminMetalLabels'
import { initTahesabSettingFromApi, tahesabEnabledSetting } from '@/utils/config'
//loading
const loading = ref<boolean>(false)
const activeTab = ref<'reports' | 'tahesab'>('reports')
const tahesabEnabled = tahesabEnabledSetting
//define store
const store = useStaticApiListsStore()
@@ -171,6 +183,7 @@ async function getCustomers() {
onMounted(() => {
getCustomers()
void initTahesabSettingFromApi()
})
//form
@@ -57,6 +57,15 @@
<template #title><span>{{ metalLabel.goldWalletCharge() }}</span></template>
<Icon icon="vuesax-linear:wallet-money" color="#ea580c" />
</a-tooltip>
<a-tooltip
v-if="tahesabEnabled && !record.moshtari_code"
placement="bottom"
class="cursor-pointer"
@click="openTahesabRegister(record)"
>
<template #title><span>ثبت در ته‌حساب</span></template>
<Icon icon="vuesax-linear:refresh-circle" color="#CA8A04" />
</a-tooltip>
<a-tooltip placement="bottom" class="cursor-pointer" @click="emits('info', record)">
<template #title><span>مشخصات</span></template>
<Icon icon="vuesax-linear:stickynote" color="#10913A" />
@@ -130,6 +139,15 @@
<BasicInfoItem title="شماره ملی" :value="confirmInfo?.n_code" />
</div>
</BasicModal>
<TahesabRetryModal
v-if="tahesabEnabled"
v-model="tahesabRegisterVisible"
mode="register-customer"
:customer-id="tahesabCustomer?.id"
:customer-name="tahesabCustomer?.name"
@success="fetch"
/>
</BasicShowContext>
</div>
</template>
@@ -154,6 +172,8 @@ import type { Customer } from '@/model/customer'
import { MODAL_ABOVE_ACTION_SHEET_Z_INDEX } from '@/constants/overlayZIndex'
import { isMobile } from '@core/utils/is'
import { metalLabel } from '@/utils/adminMetalLabels'
import TahesabRetryModal from '@/components/TahesabRetryModal.vue'
import { tahesabEnabledSetting, initTahesabSettingFromApi } from '@/utils/config'
const [submit, reload] = useBaseTable()
const emits = defineEmits(['delete', 'edit', 'add', 'info', 'chargeMoney', 'chargeGold'])
@@ -161,6 +181,9 @@ const emits = defineEmits(['delete', 'edit', 'add', 'info', 'chargeMoney', 'char
const loading = ref(false)
const confirmVisible = ref(false)
const confirmInfo = ref<Customer>()
const tahesabRegisterVisible = ref(false)
const tahesabCustomer = ref<Customer>()
const tahesabEnabled = tahesabEnabledSetting
const mobileListRef = ref<null | { fetch: () => Promise<void> }>(null)
const tblProps = ref<any>({
@@ -179,6 +202,10 @@ const fetch = async () => {
defineExpose({ fetch })
onMounted(() => {
void initTahesabSettingFromApi()
})
async function changeCustomerActivationFunction(id: number) {
try {
loading.value = true
@@ -197,6 +224,11 @@ function openConfirmUser(user: Customer) {
confirmVisible.value = true
}
function openTahesabRegister(user: Customer) {
tahesabCustomer.value = user
tahesabRegisterVisible.value = true
}
function handleArchive(customer: Customer) {
Modal.confirm({
title: 'آیا مشتری را بایگانی می کنید؟',
@@ -66,6 +66,14 @@
@click="emits('weight', record)"
/>
</a-tooltip>
<a-tooltip
v-if="tahesabEnabled && record.tahesab_failed_id"
class="cursor-pointer"
@click="openTahesabRetry(record)"
>
<template #title><span>ارسال به ته‌حساب</span></template>
<Icon icon="vuesax-linear:refresh-circle" color="#CA8A04" />
</a-tooltip>
<!-- </div>-->
</div>
</template>
@@ -80,6 +88,14 @@
@weight="(row) => emits('weight', row)"
/>
</div>
<TahesabRetryModal
v-if="tahesabEnabled"
v-model="tahesabRetryVisible"
mode="retry-sanad"
:tahesab-id="selectedTahesabId"
@success="fetch"
/>
</BasicShowContext>
</div>
</template>
@@ -98,6 +114,8 @@ import {getWithdrawTable, updateSts} from '@/api/wallet'
import WithdrawMobileCardList from './WithdrawMobileCardList.vue'
import { isMobile } from '@core/utils/is'
import type { WithdrawFlowType } from '../types'
import TahesabRetryModal from '@/components/TahesabRetryModal.vue'
import { initTahesabSettingFromApi, tahesabEnabledSetting } from '@/utils/config'
const props = withDefaults(
defineProps<{
@@ -110,6 +128,9 @@ const props = withDefaults(
const [submit, reload] = useBaseTable()
const mobileListRef = ref<null | { fetch: () => Promise<void> }>(null)
const tahesabRetryVisible = ref(false)
const selectedTahesabId = ref<number>()
const tahesabEnabled = tahesabEnabledSetting
/*const select = (val) => {
val.sts === 1 ? return ['1'] : ['2']
}*/
@@ -166,6 +187,12 @@ async function changeCustomerActivationFunction(id: number) {
async function fetch() {
await Promise.allSettled([reload(), mobileListRef.value?.fetch?.() as Promise<void>])
}
function openTahesabRetry(record: { tahesab_failed_id?: number }) {
if (!record.tahesab_failed_id) return
selectedTahesabId.value = record.tahesab_failed_id
tahesabRetryVisible.value = true
}
// const spinTable = (val: boolean) => {
// // console.log('sss')
// table?.value?.loading.value = val
@@ -175,6 +202,10 @@ defineExpose({
getExportParams: () => ({ ...lastTableParams.value, flow_type: props.flowType })
})
onMounted(() => {
void initTahesabSettingFromApi()
})
import { status } from '@/pages/menuPages/withdraw/information/hooks/status'
import {toNumber} from "lodash";
const withdrawId = ref(null)
+25
View File
@@ -16,6 +16,11 @@ let settingsBootstrapped = false
/** reactive — برای فیلتر منوی «بنرها» در پیکربندی */
export const bannerEnabledSetting = ref(false)
/** reactive — نمایش UI ته‌حsاب در حسابداری و ... */
export const tahesabEnabledSetting = ref(false)
let tahesabEnabledFromSettings: boolean | null = null
function isSwitchOn(value: string | undefined | null): boolean {
const v = (value ?? '').trim().toLowerCase()
return v === 'true' || v === '1' || v === 'yes'
@@ -29,6 +34,11 @@ export function setBannerEnabledFromSettings(value: boolean): void {
bannerEnabledSetting.value = value
}
export function setTahesabEnabledFromSettings(value: boolean): void {
tahesabEnabledFromSettings = value
tahesabEnabledSetting.value = value
}
export function applyBannerEnabledFromRows(rows: Array<{ key?: string; value?: string | null }>) {
const row = rows.find((item) => item.key === 'banner_enabled')
setBannerEnabledFromSettings(row ? isSwitchOn(row.value) : false)
@@ -45,7 +55,9 @@ async function bootstrapSettingsFromApi(): Promise<void> {
const isStoreRow = list.find((item) => item.key === 'is_store')
const mainWalletRow = list.find((item) => item.key === 'main_wallet_products')
const mainMetalRow = list.find((item) => item.key === 'main_metal')
const tahesabRow = list.find((item) => item.key === 'send_to_tahesab')
storeModeFromSettings = isStoreRow ? isSwitchOn(isStoreRow.value) : false
setTahesabEnabledFromSettings(tahesabRow ? isSwitchOn(tahesabRow.value) : false)
applyBannerEnabledFromRows(list)
setCachedMainMetal(mainMetalRow?.value)
const { setCachedMainWalletProductIds } = await import('@/components/mobile/utils/wallet')
@@ -53,6 +65,7 @@ async function bootstrapSettingsFromApi(): Promise<void> {
} catch {
storeModeFromSettings = false
setBannerEnabledFromSettings(false)
setTahesabEnabledFromSettings(false)
setCachedMainMetal(null)
const { setCachedMainWalletProductIds } = await import('@/components/mobile/utils/wallet')
setCachedMainWalletProductIds([])
@@ -77,3 +90,15 @@ export async function initWalletSettingsFromApi(): Promise<void> {
export function isStoreApp(): boolean {
return storeModeFromSettings === true
}
export function isTahesabEnabled(): boolean {
return tahesabEnabledFromSettings === true
}
export async function initTahesabSettingFromApi(): Promise<boolean> {
if (tahesabEnabledFromSettings !== null) return tahesabEnabledFromSettings === true
await bootstrapSettingsFromApi()
return tahesabEnabledFromSettings === true
}