fix price

This commit is contained in:
2026-07-29 16:02:41 +03:30
parent 2cf4ec1bd9
commit 96fa254abb
13 changed files with 313 additions and 43 deletions
@@ -70,40 +70,86 @@ export function pargarCustomerLabel(record: PargarRecord): string {
}
export function pargarAmountLabel(record: PargarRecord): string {
if (record.amount != null && record.amount !== 0) {
return formatPargarAmount(record.amount, record)
}
const payload = parsePargarPayload(record.data)
if (!payload?.transactions.length) return '-'
let maxGold = 0
let maxRial = 0
for (const tx of payload.transactions) {
maxGold = Math.max(maxGold, Math.abs(parseNum(tx.bedGold)), Math.abs(parseNum(tx.besGold)))
maxRial = Math.max(maxRial, Math.abs(parseNum(tx.bedRial)), Math.abs(parseNum(tx.besRial)))
}
if (maxGold >= 0.01) return `${maxGold} گرم`
if (maxRial >= 1) return `${maxRial.toLocaleString('fa-IR')} ریال`
const metal = pargarMetalAmountLabel(record)
const rial = pargarRialAmountLabel(record)
if (metal !== '-' && rial !== '-') return `${metal} / ${rial}`
if (metal !== '-') return metal
if (rial !== '-') return rial
return '-'
}
function formatPargarAmount(amount: number, record: PargarRecord): string {
function resolvePargarSummaryUnit(record: PargarRecord): 'rial' | 'gold' | null {
try {
const raw = record.data ? (JSON.parse(record.data) as { _summary?: { amount_unit?: string } }) : null
const unit = raw?._summary?.amount_unit
if (unit === 'rial' || unit === 'gold') return unit
} catch {
// ignore
}
if (record.type === 'wallet_cash') return 'rial'
if (record.type === 'wallet_gold' || record.type === 'mande') return 'gold'
return null
}
function maxGoldFromPayload(record: PargarRecord): number {
const payload = parsePargarPayload(record.data)
let summaryUnit: string | undefined
if (payload && '_summary' in (JSON.parse(record.data || '{}') as Record<string, unknown>)) {
const raw = JSON.parse(record.data || '{}') as { _summary?: { amount_unit?: string } }
summaryUnit = raw._summary?.amount_unit
if (!payload?.transactions.length) return 0
let maxGold = 0
for (const tx of payload.transactions) {
maxGold = Math.max(maxGold, Math.abs(parseNum(tx.bedGold)), Math.abs(parseNum(tx.besGold)))
}
return maxGold
}
function maxRialFromPayload(record: PargarRecord): number {
const payload = parsePargarPayload(record.data)
if (!payload?.transactions.length) return 0
let maxRial = 0
for (const tx of payload.transactions) {
maxRial = Math.max(maxRial, Math.abs(parseNum(tx.bedRial)), Math.abs(parseNum(tx.besRial)))
}
return maxRial
}
/** ستون مقدار — فلز/گرم (نه ریال) */
export function pargarMetalAmountLabel(record: PargarRecord): string {
if (record.type === 'wallet_cash') return '-'
const unit = resolvePargarSummaryUnit(record)
if (record.amount != null && record.amount !== 0) {
if (unit === 'rial') {
// amount ریالی است؛ فلز را از تراکنش‌ها بگیر
} else if (unit === 'gold' || unit == null) {
if (unit === 'gold' || record.type !== 'document') {
const n = Number(record.amount)
if (Number.isFinite(n) && Math.abs(n) >= 0.000001) {
return Math.abs(n - Math.round(n)) < 1e-9 ? String(Math.round(n)) : String(Number(n.toFixed(6)))
}
}
}
}
if (summaryUnit === 'rial' || record.type === 'wallet_cash') {
return `${amount.toLocaleString('fa-IR')} ریال`
const maxGold = maxGoldFromPayload(record)
if (maxGold >= 0.01) {
return Math.abs(maxGold - Math.round(maxGold)) < 1e-9
? String(Math.round(maxGold))
: String(Number(maxGold.toFixed(6)))
}
if (summaryUnit === 'gold' || record.type === 'wallet_gold' || record.type === 'mande') {
return `${amount} گرم`
return '-'
}
/** ستون مبلغ ریالی */
export function pargarRialAmountLabel(record: PargarRecord): string {
const unit = resolvePargarSummaryUnit(record)
if (record.amount != null && record.amount !== 0) {
if (unit === 'rial' || record.type === 'wallet_cash') {
return Math.round(Number(record.amount)).toLocaleString('fa-IR')
}
}
return String(amount)
const maxRial = maxRialFromPayload(record)
if (maxRial >= 1) return Math.round(maxRial).toLocaleString('fa-IR')
return '-'
}
export function pargarDescLabel(record: PargarRecord): string {