From f0c1bb6c51c49547755eb252e88914c0fe7cbde1 Mon Sep 17 00:00:00 2001 From: safavimohadeseh78 Date: Mon, 15 Jun 2026 11:01:57 +0330 Subject: [PATCH] Show boursecu assets per product from wallet API and scale day range for maftol. Fix rules paragraph alignment so Persian text does not stretch with justify. Co-authored-by: Cursor --- src/utils/productAssets.ts | 132 ++++++++++++++++++ .../base/home/components/AssetsSection.vue | 78 ++++++++--- src/views/base/home/components/PriceStats.vue | 20 ++- .../base/home/composables/usePriceChart.ts | 22 ++- .../components/DesktopAssetsMetrics.vue | 19 ++- .../desktop/components/DesktopPriceRange.vue | 20 ++- .../layouts/sections/AssetsSectionBlock.vue | 1 + .../layouts/sections/PriceStatsSection.vue | 10 +- .../rules/components/RulesContentPanel.vue | 2 +- .../rules/desktop/styles/desktop-rules.less | 2 +- .../base/rules/mobile/MobileRulesView.vue | 2 +- 11 files changed, 277 insertions(+), 31 deletions(-) diff --git a/src/utils/productAssets.ts b/src/utils/productAssets.ts index dbf9a88..346fdf6 100644 --- a/src/utils/productAssets.ts +++ b/src/utils/productAssets.ts @@ -47,6 +47,138 @@ export function getTotalMetalLabel(metalId: number): string { return `کل دارایی ${getMetalLabel(metalId)}` } +/** boursecu home — ترتیب نمایش: مس، طلا، سایر فلزها */ +export function resolveBoursecuAssetMetalTotals( + metalTotals: WalletMetalTotal[] +): WalletMetalTotal[] { + if (!metalTotals.length) { + return [] + } + + const ordered: WalletMetalTotal[] = [] + const copper = metalTotals.find((metal) => metal.metal_id === METAL_COPPER) + const gold = metalTotals.find((metal) => metal.metal_id === METAL_GOLD) + + if (copper) { + ordered.push(copper) + } + if (gold) { + ordered.push(gold) + } + + for (const metal of metalTotals) { + if (!ordered.some((item) => item.metal_id === metal.metal_id)) { + ordered.push(metal) + } + } + + return ordered +} + +export function resolveMetalAssetsDisplayLabel( + metal: WalletMetalTotal, + isBoursecuLayout: boolean +): string { + if (!isBoursecuLayout) { + return metal.label + } + + switch (metal.metal_id) { + case METAL_COPPER: + return 'دارایی مس' + case METAL_GOLD: + return 'دارایی طلایی' + case METAL_SILVER: + return 'دارایی نقره' + default: + return metal.label + } +} + +export type HomeAssetRowInfo = 'metal' | 'rial' | 'none' + +export interface HomeAssetRow { + id: string + label: string + value: string + metal?: WalletMetalTotal + info: HomeAssetRowInfo +} + +function formatInventoryCardProductLabel(card: WalletInventoryCard): string { + return `دارایی ${card.title}` +} + +function findMetalTotalById(metalTotals: WalletMetalTotal[], metalId: number) { + return metalTotals.find((metal) => metal.metal_id === metalId) +} + +/** boursecu home — هر محصول / فلز / ریال از customer/wallet/assets جدا نمایش داده می‌شود */ +export function buildBoursecuHomeAssetRows( + summary: { + inventory_cards?: WalletInventoryCard[] + count_products?: WalletInventoryCard[] + metal_totals?: WalletMetalTotal[] + total_rial_value?: number + } | null | undefined +): HomeAssetRow[] { + if (!summary) { + return [] + } + + const rows: HomeAssetRow[] = [] + const metalTotals = summary.metal_totals ?? [] + const inventoryCards = summary.inventory_cards ?? [] + const countProducts = summary.count_products ?? [] + + for (const card of inventoryCards) { + if (card.display_type === 'count') { + continue + } + + rows.push({ + id: `inventory-${card.product_id}`, + label: formatInventoryCardProductLabel(card), + value: formatInventoryCardValue(card), + metal: findMetalTotalById(metalTotals, card.metal_id), + info: 'metal', + }) + } + + for (const metal of metalTotals) { + if (metal.metal_id === METAL_COPPER) { + continue + } + + rows.push({ + id: `metal-${metal.metal_id}`, + label: resolveMetalAssetsDisplayLabel(metal, true), + value: `${Number(metal.total_weight ?? 0)}${metal.unit ?? ''}`, + metal, + info: 'metal', + }) + } + + for (const card of countProducts) { + rows.push({ + id: `count-${card.product_id}`, + label: formatInventoryCardProductLabel(card), + value: formatInventoryCardValue(card), + metal: findMetalTotalById(metalTotals, card.metal_id), + info: 'metal', + }) + } + + rows.push({ + id: 'rial-total', + label: 'دارایی ریالی', + value: `${formatRialNumber(summary.total_rial_value ?? 0)} ریال`, + info: 'rial', + }) + + return rows +} + export function sumInventoryCardsWeight( cards: Array<{ metal_id?: number; quantity?: number }>, metalId: number diff --git a/src/views/base/home/components/AssetsSection.vue b/src/views/base/home/components/AssetsSection.vue index 4da29b9..166181e 100644 --- a/src/views/base/home/components/AssetsSection.vue +++ b/src/views/base/home/components/AssetsSection.vue @@ -1,14 +1,34 @@